42. select 的默认分支 | 厚土Go学习笔记
时间:2022-05-04
本文章向大家介绍42. select 的默认分支 | 厚土Go学习笔记,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
for select
是一个多分支循环,其中 select
分支如果都没有准备好执行,那么 default
默认分支就会被执行。
为了非阻塞的发送或接收,就可以使用 default
分支。
我们举例一个爆破过程,有读秒、有爆炸、有过程。读秒为每半秒钟读一次,过程为1/4秒一个记录,最后爆炸。完结。
先准备两个计时器,分别设定读秒时长和爆炸时长。
tick := time.Tick(500 * time.Millisecond)
boom := time.After(2000 * time.Millisecond)
然后使用 for select
循环,“过程”会执行 default
分支,“读秒”会执行 <-tick
分支,直到“爆炸” <- boom
分支执行到 return
,循环结束。
for {
select {
case <-tick:
fmt.Println("tick.")
case <-boom:
fmt.Println("boom!")
return
default:
fmt.Println(" .")
time.Sleep(250 * time.Millisecond)
}
}
由于 tick 和 boom 分别需要 500 和 2000 毫秒才会有数据过来,那么其他时间会执行 default
。而 default
每次执行会休眠 250毫秒,所以每 250毫秒才会输出一个 " ." 。
完整代码示例
package main
import (
"time"
"fmt"
)
func main() {
tick := time.Tick(500 * time.Millisecond)
boom := time.After(2000 * time.Millisecond)
for{
select {
case <-tick:
fmt.Println("tick.")
case <-boom:
fmt.Println("boom!")
return
default:
fmt.Println(" .")
time.Sleep(250 * time.Millisecond)
}
}
}
运行结果
.
.
tick.
.
.
tick.
.
.
tick.
.
.
boom!
如果你删除 time.Sleep(250 * time.Millisecond)
这条语句,就会发现,程序运行开始后,会一直执行 default
,直到 boom。多运行几次,偶尔会显示 tick 。这是在抢通道么?由于上一次执行的 default
,所以再次循环过来的时候,大多数情况下优先执行 default
了。
- limit_area_cirle
- Spring RestTemplate中几种常见的请求方式
- 什么是客户端负载均衡
- jQuery 升级踩坑大全
- Eureka中的核心概念
- Spring Cloud Zuul中异常处理细节
- Spring Cloud Zuul中路由配置细节
- Spring Cloud中的API网关服务Zuul
- MYSQL | 企业整合解决方案之mysql集群搭建-主从配置
- Spring Cloud中Feign配置详解
- Spring Cloud中Feign的继承特性
- JavaScript 常用方法总结
- Spring Cloud中声明式服务调用Feign
- Spring Cloud中Hystrix仪表盘与Turbine集群监控
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- AkShare-股票数据-板块行情
- AkShare-股票数据-流通股东
- SpringBoot系列之使用Spring Task实现定时任务
- AkShare-股票数据-分时数据
- AkShare-基金数据-基金行情数据
- AkShare-期权数据-商品期权
- AkShare-股票数据-破净股统计
- AkShare-股票数据-创新高和新低的股票数量
- AkShare-股票数据-A股个股市盈率、市净率和股息率
- AkShare-股票数据-A股市净率
- AkShare-股票数据-A股市盈率
- AkShare-期货数据-期货交易日历
- AkShare-另类数据-彭博亿万富豪指数
- AkShare-股票数据-券商业绩月报
- AkShare-期货数据-仓单日报-上海期货交易所