1、多路选择操作符 select

在golang语言中,select语句 就是用来监听和channel有关的IO操作,当IO操作发生时,触发相应的case动作。有了 select语句,可以实现 main主线程 与 goroutine线程 之间的互动。
select 使用时类似 switch-case 的用法,适用于处理多通道的场景,会通过类似 are-you-ready-polling 的机制来工作。

select {case <-ch1 :     // 检测有没有数据可读// 一旦成功读取到数据,则进行该case处理语句case ch2 <- 1 :  // 检测有没有数据可写// 一旦成功向ch2写入数据,则进行该case处理语句default:// 如果以上都没有符合条件,那么进入default处理流程
}

2、阻塞与非阻塞 select

select 默认是阻塞的,当没有 case 处于激活状态时,会一直阻塞住,极端的甚至可以这样用:

select {// 啥也不干,一直阻塞住
}

通过增加 default,可以实现非阻塞的 select

select {case x, ok := <-ch1:...case ch2 <- y:...default:fmt.Println("default")}

3、多 case 与 default 执行的顺序

整体流程如图所示:

4、注意事项

  • 随机性:多个 case 之间并非顺序的,遵循「先到先执行,同时到则随机执行」的原则
  • 一次性:和 switch-case 一样,select-case也只会执行一次,如果需要多次处理,需要在外层套一个循环
  • default 不会阻塞,会一直执行,当与 for 循环组合使用时可能出现死循环,如下面代码所示:
func main() {var ch chan inti := 0for {select {case <-ch:  // nil channel 永远阻塞fmt.Println("never...")default:fmt.Printf("in default, i = %d\n", i)}i++}
}

go语法 — 多路选择操作符 select的用法相关推荐

  1. Go 分布式学习利器(20)-- Go并发编程之多路选择和超时控制,channel的关闭和广播

    Select 多路选择 基本使用语法如下: select {case ret := <-retCh1: //阻塞事件,等待channel1的消息t.Logf("result %s \n ...

  2. mysql select语法_MySQL SELECT语法(一)SELECT语法详解

    SELECT的语法如下: SELECT[ALL | DISTINCT | DISTINCTROW ] [HIGH_PRIORITY] [STRAIGHT_JOIN] [SQL_SMALL_RESULT ...

  3. mysql select语句详解_mysql学习笔记之完整的select语句用法实例详解

    本文实例讲述了mysql学习笔记之完整的select语句用法.分享给大家供大家参考,具体如下: 本文内容: 完整语法 去重选项 字段别名 数据源 where group by having order ...

  4. mysql数据库select语句用法_mysql学习笔记之完整的select语句用法实例详解

    本文实例讲述了mysql学习笔记之完整的select语句用法.分享给大家供大家参考,具体如下: 本文内容: 完整语法 去重选项 字段别名 数据源 where group by having order ...

  5. golang select关键字用法

    select是go语言中常用的一个关键字,其用法也一直被用作面试题来考核应聘者.今天,结合代码来分析下select的主要用法. 首先,我们来从官方文档看一下有关select的描述: A "s ...

  6. SQL语句 SELECT LIKE用法详解

    在SQL结构化查询语言中,LIKE语句有着至关重要的作用. LIKE语句的语法格式是:select * from 表名 where 字段名 like 对应值(子串),它主要是针对字符型字段的,它的作用 ...

  7. Linux下I/O多路转接之select --fd_set

    fd_set 你终于还是来了,能看到这个标题进来的,我想,你一定是和我遇到了一样的问题,一样的疑惑,接下来几个小时,我一定竭尽全力,写出我想说的,希望也正是你所需要的: 关于Linux下I/O多路转接 ...

  8. Shell脚本中循环select命令用法笔记

    在Shell脚本中,select命令是一种菜单扩展的循环方式. 语法结构如下: select Menu in (list) do command done 说明:当程序运行到select语句时,会自动 ...

  9. SELECT 的用法

    这里写自定义目录标题 SELECT 的用法 SELECT 语句定义 SELECT 语法 SELECT 列名实例 SELECT * 实例 SELECT 的用法 SELECT 语句定义 SELECT 语句 ...

  10. Bootstrap 表单控件一(单行输入框input,下拉选择框select ,文本域textarea)

    单行输入框,常见的文本输入框,也就是input的type属性值为text.在Bootstrap中使用input时也必须添加type类型,如果没有指定type类型,将无法得到正确的样式,因为Bootst ...

最新文章

  1. 在Linux下如何安装配置SVN服务
  2. Android Jetpack 组件之 Lifecycle使用
  3. python到底干嘛的-Python是干嘛的?可以做什么?老男孩Python培训班
  4. pymysql安装_openstack stein安装placement
  5. android 关闭多点触控_Cocos Creator关闭多点触摸的问题
  6. 盯紧那群养生的年轻人,他们的焦虑值300亿
  7. Intel Skylake (Client) 架构/微架构/流水线 (2) - 前端
  8. Tomcat Server的结构图
  9. java编写一个彩票开奖的模拟程序.游戏共有两种玩法,一种是21选5,即玩家输入5个1到21内的不重复的数。另外一种玩法是6+1玩法,即要求玩家输入7个整数,代表所购买的彩票号码,最后一个是特码。
  10. 2492 上帝造题的七分钟 2
  11. UNet多类别分割的keras实现
  12. mes系统服务器连接失败,mes系统如何连接其他系统设备?
  13. 关于解决keil5中*** FATAL ERROR L250: CODE SIZE LIMIT IN RESTRICTED VERSION EXCEEDED的问题
  14. 计算机WORD列宽行高怎么设置,word2010表格列宽和行高怎么设置
  15. input onfocus
  16. Altium Designer(AD)的简易使用
  17. springboot将文件响应给前端
  18. Mysql-DATE_FORMAT()日期格式
  19. 网络安全—2.1—设备原理与操作
  20. 13. 均匀分布和指数分布

热门文章

  1. 使用C++读取二进制文件(dat格式)
  2. Apple Pencil 一代和二代有什么区别
  3. inurl:faq.php?action=,什么是财富等级 | 帮助 | 酷狗直播 | 就是歌手多
  4. 帝国cms二次开发应用
  5. <POSTGRESQL修炼之道:从小工到专家>之逻辑结构管理(1-5节)
  6. ORA-20011, KUP-11024 外部表引发报错
  7. Linux/centos备份系统镜像工具
  8. python微分几何_十一年磨一剑:中科大数学教授成功证明微分几何学两大猜想
  9. 微分几何笔记(1)——参数曲线、内积、外积
  10. 深入理解oracle的context,读者对于《深入解析Oracle》的评价