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
了。
- 分享一波关于做 Kaggle 比赛,Jdata,天池的经验,看完我这篇就够了。
- system表空间不足的问题分析(r6笔记第66天)
- 挑战数据结构和算法面试题——最大间隔
- 一则orabbix报警的分析(r6笔记第65天)
- 中科院计算所开源深度文本匹配开源工具 MatchZoo
- 简单易学的机器学习算法——线性回归(1)
- 当主键碰到NULL(r6笔记第64天)
- 记一次dg故障的处理总结(r6笔记第63天)
- Java企业面试——Javaweb
- Linux下/var/spool/clientmqueue空间不足的解决(r6笔记第81天)
- Pytorch 0.3发布:实现多方面提速,增加对ONNX支持 | 快讯
- 基于DB time的调优分析 (r6笔记第79天)
- 通过shell脚本抓取awr报告中的问题sql(r6笔记第78天)
- Tomcat 快速入门
- 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 数组属性和方法
- 使用IDEA整合spring4+spring mvc+hibernate
- springmvc中@PathVariable和@RequestParam的区别
- centos7 安装mysql5.6
- bashdb安装及调试shell脚本
- linux awk指令详解
- linux sed指令详解
- Grafana使用zabbix自定义模板
- linux shell之变量的使用规则
- 第11期:压缩表
- grafana-zabbix插件安装和配置zabbix mysql
- grafana使用教程之API key
- Grafana使用教程之安装
- Java基础数据类型之包装类equals和==详解
- SCP不用密码传输文件
- Java 使用Collections.reverse对list集合进行降序排序