注意

  • 监听的case中,没有满足条件的就阻塞
  • 多个满足条件的就任选一个执行
  • select本身不带循环,需要外层的for
  • default通常不用,会产生忙轮询
  • break只能跳出select中的一个case
  1. 加入了默认分支,那么无论涉及通道操作的表达式是否有阻塞,select语句都不会被阻塞。如果那几个表达式都阻塞了,或者说都没有满足求值的条件,那么默认分支就会被选中并执行。

  2. 如果没有加入默认分支,那么一旦所有的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详解相关推荐

  1. Asp.net中GridView使用详解(引)【转】

    Asp.net中GridView使用详解(引) GridView无代码分页排序 GridView选中,编辑,取消,删除 GridView正反双向排序 GridView和下拉菜单DropDownList ...

  2. Linux中iptraf命令详解(IP局域网监控工具)

    2019独角兽企业重金招聘Python工程师标准>>> Linux中iptraf命令详解(IP局域网监控工具) 发布时间:2017-12-27 20:46:03   作者:佚名    ...

  3. oracle数据库中索值,Oracle数据库中的索引详解

    Oracle数据库中的索引详解以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一 ROWID的概念 存储了row在数据文 ...

  4. Java中JDBC连接数据库详解

    今天动力节点java学院小编分享的是JDBC连接数据库的相关知识,希望通过看过此文,各位小伙伴对DBC连接数据库有所了解,下面就跟随小编一起来看看JDBC连接数据库的知识吧. 一.JDBC连接数据库概 ...

  5. pdo mysql limit_PHP mysql中limit用法详解(代码示例)

    在MySQL中,LIMIT子句与SELECT语句一起使用,以限制结果集中的行数.LIMIT子句接受一个或两个offset和count的参数.这两个参数的值都可以是零或正整数. offset:用于指定要 ...

  6. JavaWeb中filter的详解及应用案例

    JavaWeb中filter的详解及应用案例 转载自:http://www.cnblogs.com/vanl/p/5742501.html 一:Filter介绍 Filter可认为是Servlet的一 ...

  7. oralce中的dual详解

    oralce中的dual详解 dual是属于sys的 只有一个X varchar2(1)列 查询虚拟列不会产生逻辑IO ======================================== ...

  8. Pandas中resample方法详解

    Pandas中resample方法详解 Pandas中的resample,重新采样,是对原样本重新处理的一个方法,是一个对常规时间序列数据重新采样和频率转换的便捷的方法.重新取样时间序列数据. 方便的 ...

  9. MyBatis中@MapKey使用详解

    MyBatis中@MapKey使用详解 我们在上一篇文章中讲到在Select返回类型中是返回Map时,是对方法中是否存在注解@MapKey,这个注解我也是第一次看到,当时我也以为是纯粹的返回单个数据对 ...

最新文章

  1. td不显示边框_FANUC Series 0i Mate-TD系统上电显示SP1241 (S)D/A变换器异常维修,FANUC主板SP1_维修中心...
  2. oracle 中least,ORACLE 内置函数之GREATEST和LEAST
  3. 全卷积网络FCN详解
  4. 无招胜有招之Java进阶JVM(一)
  5. [C++STL]C++实现list容器
  6. JAVA入门级教学之(内存地址的引用示例)
  7. python语义分析_Python差异的潜在语义分析
  8. mysql新建授权账号系列问题
  9. vue实现轮播图(每隔两秒自动翻页、翻到末页自动返回首页、点击按钮左右翻页)
  10. ooffice为保护计算机,office已检测到此文件存在问题编辑此文件可能会损害您的计算机!...
  11. 第一篇 -- 《每天读一点经济学常识 》 --于台风
  12. 计算机变成英语,win10系统下计算器界面变成英文界面了怎么办
  13. C# winform 工具箱、控件类型简介表
  14. mac关闭当前窗口快捷键,mac关闭当前应用快捷键
  15. 初级软件测试工程师:测试路上披荆斩棘,争做大厂程序员,斩获高薪offer~
  16. 魔兽私服Trinitycore架构设计分析之一
  17. javascript 判断 flash 插件是否安装
  18. maven私服搭建,sonatype nexus
  19. 微信小程序爱江山更爱美人忘记服务器,爱江山更爱美人微信小程序
  20. SSH远程登录报错 IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!

热门文章

  1. 【Android 电量优化】电量优化 ( JobScheduler | JobService | AsyncTask )
  2. 【Kotlin】Kotlin 领域特定语言 DSL 原理 一 ( DSL 简介 | 函数 / 属性扩展 )
  3. 【Java 网络编程】TCP 连接 断开 机制 ( 三次握手 | 四次挥手 )
  4. box-shadow实现曲线投影效果
  5. Cmder命令行工具在Windows系统中的配置
  6. KB2533623 下载
  7. iOS开发——你真的会用SDWebImage?
  8. 求幂运算、多项式乘法及Horner法则的应用
  9. Core Text 入门
  10. 使用JQuery从客户端调用C#方法