摘要1:原文go select的用法 - 梁天 - 博客园golang中的select语句格式如下 select { case <-ch1: // 如果从 ch1 信道成功接收数据,则执行该分支代码 case ch2 <- 1: // 如果成功向https://www.cnblogs.com/gwyy/p/13629999.html

摘要2:Go-select语句详解_Chasel_H-CSDN博客_go select 语句

摘要3:GO学习-(36) Go语言在select语句中实现优先级 - 小学弟- - 博客园

golang中的select语句格式如下

select {case <-ch1:// 如果从 ch1 信道成功接收数据,则执行该分支代码case ch2 <- 1:// 如果成功向 ch2 信道成功发送数据,则执行该分支代码default:// 如果上面都没有成功,则进入 default 分支处理流程
}

可以看到select的语法结构有点类似于switch,但又有些不同。

select里的case后面并不带判断条件,而是一个信道的操作,不同于switch里的case,对于从其它语言转过来的开发者来说有些需要特别注意的地方。

golang 的 select 就是监听 IO 操作,当 IO 操作发生时,触发相应的动作每个case语句里必须是一个IO操作,确切的说,应该是一个面向channel的IO操作。

注:Go 语言的 select 语句借鉴自 Unix 的 select() 函数,在 Unix 中,可以通过调用 select() 函数来监控一系列的文件句柄,一旦其中一个文件句柄发生了 IO 动作,该 select() 调用就会被返回(C 语言中就是这么做的),后来该机制也被用于实现高并发的 Socket 服务器程序。Go 语言直接在语言级别支持 select关键字,用于处理并发编程中通道之间异步 IO 通信问题。

注意:如果 ch1 或者 ch2 信道都阻塞的话,就会立即进入 default 分支,并不会阻塞。但是如果没有 default 语句,则会阻塞直到某个信道操作成功为止。

知识点

  1. select语句只能用于信道的读写操作
  2. select中的case条件(非阻塞)是并发执行的,select会选择先操作成功的那个case条件去执行,如果多个同时返回,则随机选择一个执行,此时将无法保证执行顺序。对于阻塞的case语句会直到其中有信道可以操作,如果有多个信道可操作,会随机选择其中一个 case 执行
  3. 对于case条件语句中,如果存在信道值为nil的读写操作,则该分支将被忽略,可以理解为从select语句中删除了这个case语句
  4. 如果有超时条件语句,判断逻辑为如果在这个时间段内一直没有满足条件的case,则执行这个超时case。如果此段时间内出现了可操作的case,则直接执行这个case。一般用超时语句代替了default语句
  5. 对于空的select{},会引起死锁
  6. 对于for中的select{}, 也有可能会引起cpu占用过高的问题

select 实例1:

package mainimport ("fmt""log""runtime""time"
)func main() {log.Println("111")ch1 := make(chan int)ch2 := make(chan bool)// go test1(ch1)// go test2(ch2)go func() {for i := 0; i < 10; i++ {ch1 <- i}close(ch1)ch2 <- trueruntime.Goexit()  // 退出子协程}()for {select {case n := <-ch1:fmt.Println(n)case <-ch2:// break  // 跳出select// return    // 退出整个程序goto Exit  // 跳转到程序定义的标签位置}}Exit:fmt.Println("主协程结束")}

注意:主协程不能使用`runtime.Goexit()`

空select:

package mainfunc main() {select {// 永久阻塞}fmt.Println("主程序退出!")  // 永远不会执行到这个位置
}

总结:

  • select 不存在 任何case:永久阻塞当前goroutine
  • select 只存在一个case:阻塞的发送/接收
  • select 存在多个case:随机选择一个满足条件的case执行
  • select 存在default,其他case都不满足条件时:执行default语句中的代码

select优先级:

package mainimport ("fmt""log""time"
)// 优先级示例
func worker(ch1, ch2 <-chan int, stopCh chan struct{}) {for {select {case <-stopCh:returncase job1 := <-ch1:fmt.Println(job1) // 优先处理job1case job2 := <-ch2:priority:for {select {case job1 := <-ch1:fmt.Println(job1) // 优先处理job1default:break priority}}fmt.Println(job2) // 当ch1通道没有数据时,才处理job2}}
}func main() {log.Println("111")ch1 := make(chan int)ch2 := make(chan int)ch3 := make(chan struct{})go worker(ch1, ch2, ch3)go func() {for i := 0; i < 10; i++ {ch1 <- i}// close(ch1)}()go func() {for i := 0; i < 10; i++ {time.Sleep(time.Millisecond * 100) // 休眠100毫秒ch2 <- i + 100}// close(ch2)}()time.Sleep(time.Second * 5)ch3 <- struct{}{}}

Go select chan操作相关推荐

  1. JQUERY对RADIO,CHECKBOX,SELECT的操作常用方法大全

    JQUERY对RADIO,CHECKBOX,SELECT的操作 ******************************************************************** ...

  2. 数据库实验4 SQL语言-SELECT查询操作

    数据库实验4 SQL语言-SELECT查询操作 1.首先按照第三章的jxgl数据库的模板创建jxgl数据库并插入数据: 创建数据库jxgl: create database jxgl; 创建相应的表: ...

  3. 数据库系统实验4:SQL——SELECT查询操作

    数据库系统实验4:SQL语言--SELECT查询操作 数据库系统实验4:SQL语言--SELECT查询操作 实验环境 实验内容 步骤及过程 首先按以下SQL语句创建测试用的jxgl数据库 使用SQL语 ...

  4. 实验二 SQL 语言——SELECT 查询操作(第一部分)

    SQL 语言--SELECT 查询操作 实验目的: -了解查询的概念和方法:-掌握 SQL Server 集成管理器查询子窗口中执行 SELECT 操作的方法:-掌握 SELECT 语句在单表查询中的 ...

  5. select标签操作 select2使用详解

    select标签操作 select2使用详解 官网: https://select2.github.io/examples.html 引用: <link href="~/Scripts ...

  6. 【jq】JQuery对select的操作

    下拉框 <select id="selectID" name="selectName"> <option vlaue="1" ...

  7. mysql中视图和表的区别及联系_MySQL中Update、select联用操作单表、多表,及视图与临时表的区别...

    一.MySQL中使用从表A中取出数据来更新表B的内容 例如:要update表data中的一些列属性,但是修改属性的内容来源是来自表chanpin.SQL语言中不要显示的出现select关键字 upda ...

  8. select 的操作

    2019独角兽企业重金招聘Python工程师标准>>> 每一次操作select的时候,总是要出来翻一下资料,不如自己总结一下,以后就翻这里了. 比如<select class= ...

  9. 【SQL语言——SELECT查询操作】

    基于创建的数据库(包含读者.图书.借阅三张表),试用SQL的查询语句表达下列查询: 1.查询图书表中售价介于50元到70元之间的图书的全部信息 2.查询图书表中全部图书的最高售价.最低售价和平均售价. ...

  10. jquery对select的操作详解

    select的html标签如下:<select class="xxx" id="yyy"><option></option> ...

最新文章

  1. 零基础入门学习Python(8)-了不起的分支和循环3
  2. Mac过热降频的罪魁祸首,竟是插到了左边的Type-C口
  3. hdu 3064
  4. linux 进程管理 ppt,linux操作系统-进程管理和打印管理.ppt
  5. 数学奥赛用不用计算机,报考自招必看!五大学科竞赛利弊详解,到底哪科最适合你?...
  6. Spark _14_SparkShell的使用
  7. java 无法注入service_SpringBoot集成shiro,MyRealm中无法@Autowired注入Service的问题
  8. 同样是Java程序员,如何比别人更优秀?
  9. 批处理(bat)choice命令详解
  10. Unity官方案例精讲_2015_优化
  11. 最新友情链接交易平台源码,友链源码,友情链接,友链平台仿alivv爱链网源码下载
  12. Anomalies,Factors,andMultiFactorModels
  13. 免费PBootCMS采集支持聚合文章采集插件
  14. flutter小说阅读页之爬坑记录-半角转全角字符
  15. 基于JAVA汽车租赁系统计算机毕业设计源码+系统+lw文档+部署
  16. HJ70 矩阵乘法计算量估算 ——
  17. uniapp上高德(百度)地图API的使用(APP安卓)
  18. 基于IDL的高分二号影像批量预处理程序
  19. 区块链需要学习哪些东西_学习区块链需要什么基础?小白必看
  20. matlab中som结果,som 运行结果怎么看啊

热门文章

  1. 宽带拨号任何使用计算机,电脑如何用宽带连接拨号上网?
  2. 打开SharePoint时遇到“Server error: http://go.microsoft.com/fwlink?LinkID=96177”
  3. 继屠呦呦后,下一个得诺奖的中国人可能是他?
  4. 笑声的音效素材,几百个你想要的都在这
  5. WIN10去除磁盘写保护(只读属性)的步骤
  6. ANSYS Icepak电子散热基础教程+ANSYS Icepak进阶应用导航案例.zip
  7. 51单片机学习篇-- --静态数码管的显示(74HC138译码器,74HC245锁存器,74HC573锁存器)
  8. 玩游戏计算机配置,电脑玩游戏主要看什么配置 玩大型游戏电脑配置推荐
  9. ORB-SLAM2详解(一)文献导读
  10. 将博客搬至CSDN_wuli大世界_新浪博客