golang中的select详解
注意
- 监听的case中,没有满足条件的就阻塞
- 多个满足条件的就任选一个执行
- select本身不带循环,需要外层的for
- default通常不用,会产生忙轮询
- break只能跳出select中的一个case
加入了默认分支,那么无论涉及通道操作的表达式是否有阻塞,select语句都不会被阻塞。如果那几个表达式都阻塞了,或者说都没有满足求值的条件,那么默认分支就会被选中并执行。
如果没有加入默认分支,那么一旦所有的case表达式都没有满足求值条件,那么select语句就会被阻塞。直到至少有一个case表达式满足条件为止。
如果select语句发现同时有多个候选分支满足选择条件,那么它就会用一种伪随机的算法在这些分支中选择一个并执行。注意,即使select语句是在被唤醒时发现的这种情况,也会这样做
作用
go里面提供了一个关键字select,通过select可以监听channel上的数据流动
select的用法与switch语言非常类似,由select开始一个新的选择块,每个选择块条件由case语句来描述
与switch语句可以选择任何可使用相等比较的条件相比,select有比较多的限制,其中最大的一条限制就是每个case语句里必须是一个IO操作
for {select {case <-chan1://.....case chan2<-1://....default://都没成功,进入......}
}
在一个select语句中,go语言会按顺序从头到尾评估每一个发送和接收的语句
如果其中的任意一语句可以继续执行(即没有被阻塞),那么就从哪些可以执行的语句中任意选择一条来使用
如果没有任意一条语句可以执行(即所有的通道都被阻塞),那么有两种可能的情况:
- 如果给出了default语句,那么就会执行default语句,同时程序的执行会从select语句后的语句中恢复
- 如果没有default语句,那么select语句将被阻塞,直到至少有一个通信可以进行下去
防止channel超时机制
有时候会出现协程阻塞的情况,那么我们如何避免这个情况?我们可以使用select来设置超时
func main() {c := make(chan int)o := make(chan bool)go func() {for {select {case v:= <-c:fmt.Println(v)//5秒钟自动关闭,避免长时间超时case <-time.After(5 * time.Second):fmt.Println("timeout")o<-truebreak}}}()//有值就主协程走,主协程走完就都没了<-ofmt.Println("程序结束")
}
golang中的select详解相关推荐
- Asp.net中GridView使用详解(引)【转】
Asp.net中GridView使用详解(引) GridView无代码分页排序 GridView选中,编辑,取消,删除 GridView正反双向排序 GridView和下拉菜单DropDownList ...
- Linux中iptraf命令详解(IP局域网监控工具)
2019独角兽企业重金招聘Python工程师标准>>> Linux中iptraf命令详解(IP局域网监控工具) 发布时间:2017-12-27 20:46:03 作者:佚名 ...
- oracle数据库中索值,Oracle数据库中的索引详解
Oracle数据库中的索引详解以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一 ROWID的概念 存储了row在数据文 ...
- Java中JDBC连接数据库详解
今天动力节点java学院小编分享的是JDBC连接数据库的相关知识,希望通过看过此文,各位小伙伴对DBC连接数据库有所了解,下面就跟随小编一起来看看JDBC连接数据库的知识吧. 一.JDBC连接数据库概 ...
- pdo mysql limit_PHP mysql中limit用法详解(代码示例)
在MySQL中,LIMIT子句与SELECT语句一起使用,以限制结果集中的行数.LIMIT子句接受一个或两个offset和count的参数.这两个参数的值都可以是零或正整数. offset:用于指定要 ...
- JavaWeb中filter的详解及应用案例
JavaWeb中filter的详解及应用案例 转载自:http://www.cnblogs.com/vanl/p/5742501.html 一:Filter介绍 Filter可认为是Servlet的一 ...
- oralce中的dual详解
oralce中的dual详解 dual是属于sys的 只有一个X varchar2(1)列 查询虚拟列不会产生逻辑IO ======================================== ...
- Pandas中resample方法详解
Pandas中resample方法详解 Pandas中的resample,重新采样,是对原样本重新处理的一个方法,是一个对常规时间序列数据重新采样和频率转换的便捷的方法.重新取样时间序列数据. 方便的 ...
- MyBatis中@MapKey使用详解
MyBatis中@MapKey使用详解 我们在上一篇文章中讲到在Select返回类型中是返回Map时,是对方法中是否存在注解@MapKey,这个注解我也是第一次看到,当时我也以为是纯粹的返回单个数据对 ...
最新文章
- td不显示边框_FANUC Series 0i Mate-TD系统上电显示SP1241 (S)D/A变换器异常维修,FANUC主板SP1_维修中心...
- oracle 中least,ORACLE 内置函数之GREATEST和LEAST
- 全卷积网络FCN详解
- 无招胜有招之Java进阶JVM(一)
- [C++STL]C++实现list容器
- JAVA入门级教学之(内存地址的引用示例)
- python语义分析_Python差异的潜在语义分析
- mysql新建授权账号系列问题
- vue实现轮播图(每隔两秒自动翻页、翻到末页自动返回首页、点击按钮左右翻页)
- ooffice为保护计算机,office已检测到此文件存在问题编辑此文件可能会损害您的计算机!...
- 第一篇 -- 《每天读一点经济学常识 》 --于台风
- 计算机变成英语,win10系统下计算器界面变成英文界面了怎么办
- C# winform 工具箱、控件类型简介表
- mac关闭当前窗口快捷键,mac关闭当前应用快捷键
- 初级软件测试工程师:测试路上披荆斩棘,争做大厂程序员,斩获高薪offer~
- 魔兽私服Trinitycore架构设计分析之一
- javascript 判断 flash 插件是否安装
- maven私服搭建,sonatype nexus
- 微信小程序爱江山更爱美人忘记服务器,爱江山更爱美人微信小程序
- SSH远程登录报错 IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
热门文章
- 【Android 电量优化】电量优化 ( JobScheduler | JobService | AsyncTask )
- 【Kotlin】Kotlin 领域特定语言 DSL 原理 一 ( DSL 简介 | 函数 / 属性扩展 )
- 【Java 网络编程】TCP 连接 断开 机制 ( 三次握手 | 四次挥手 )
- box-shadow实现曲线投影效果
- Cmder命令行工具在Windows系统中的配置
- KB2533623 下载
- iOS开发——你真的会用SDWebImage?
- 求幂运算、多项式乘法及Horner法则的应用
- Core Text 入门
- 使用JQuery从客户端调用C#方法