golang 的 select 的功能和 select, poll, epoll 相似, 就是监听 IO 操作,当 IO 操作发生时,触发相应的动作。

示例:

ch1 := make (chan int, 1)
ch2 := make (chan int, 1)...select {
case <-ch1:fmt.Println("ch1 pop one element")
case <-ch2:fmt.Println("ch2 pop one element")
}

注意到 select 的代码形式和 switch 非常相似, 不过 select 的 case 里的操作语句只能是【IO 操作】 。

此示例里面 select 会一直等待等到某个 case 语句完成, 也就是等到成功从 ch1 或者 ch2 中读到数据。 则 select 语句结束。

【使用 select 实现 timeout 机制】

如下:

timeout := make (chan bool, 1)
go func() {time.Sleep(1e9) // sleep one secondtimeout <- true
}()
ch := make (chan int)
select {
case <- ch:
case <- timeout:fmt.Println("timeout!")
}

当超时时间到的时候,case2 会操作成功。 所以 select 语句则会退出。 而不是一直阻塞在 ch 的读取操作上。 从而实现了对 ch 读取操作的超时设置。

下面这个更有意思一点。

当 select 语句带有 default 的时候:

ch1 := make (chan int, 1)
ch2 := make (chan int, 1)select {
case <-ch1:fmt.Println("ch1 pop one element")
case <-ch2:fmt.Println("ch2 pop one element")
default:fmt.Println("default")
}

此时因为 ch1 和 ch2 都为空,所以 case1 和 case2 都不会读取成功。 则 select 执行 default 语句。

就是因为这个 default 特性, 我们可以使用 select 语句来检测 chan 是否已经满了。

如下:

ch := make (chan int, 1)
ch <- 1
select {
case ch <- 2:
default:fmt.Println("channel is full !")
}

因为 ch 插入 1 的时候已经满了, 当 ch 要插入 2 的时候,发现 ch 已经满了(case1 阻塞住), 则 select 执行 default 语句。 这样就可以实现对 channel 是否已满的检测, 而不是一直等待。

比如我们有一个服务, 当请求进来的时候我们会生成一个 job 扔进 channel, 由其他协程从 channel 中获取 job 去执行。 但是我们希望当 channel 瞒了的时候, 将该 job 抛弃并回复 【服务繁忙,请稍微再试。】 就可以用 select 实现该需求

【golang】Go语言学习-select用法相关推荐

  1. [Golang]Go语言学习资源集合

    说明 对于新手来讲,入门一门新的语言无疑是有困难的,往往会因为找不到方向而迷失.在我的学习golang的过程中,也碰到了该如何入手的问题,还好我善于搜索,有一些基础,入手的时候没有碰到太多困难.但是如 ...

  2. SQL语言的基本用法——学习笔记

    SQL语言的基本用法   结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询.更新和管理关系 ...

  3. Python语言学习之字母L开头函数使用集锦:logging日志用法之详细攻略

    Python语言学习之字母L开头函数使用集锦:logging日志用法之详细攻略 目录 logging日志用法之详细攻略 logging日志用法之详细攻略 K Llogging.basicConfig( ...

  4. Python语言学习之字母E开头函数使用集锦:endswith使用用法之详细攻略

    Python语言学习之字母E开头函数使用集锦:endswith使用用法之详细攻略 目录 endswith用法之详细攻略 enumerate()函数 endswith用法之详细攻略 if my_file ...

  5. Python语言学习之字母G开头函数使用集锦:global用法之详细攻略

    Python语言学习之字母G开头函数使用集锦:global用法之详细攻略 global全局变量用法 global全局变量:python使用的变量默认一定是用局部变量:如果想使用作用域之外的全局变量,则 ...

  6. Python语言学习之字母A开头函数使用集锦:assert用法之详细攻略

    Python语言学习之字母A开头函数使用集锦:assert用法之详细攻略 assert断言的用法 assert断言用法:防御性的编程.运行时对程序逻辑的检测.合约性检查(比如前置条件,后置条件).程序 ...

  7. Python语言学习之字母R开头函数使用集锦:random/range/replace/reshape用法之详细攻略

    Python语言学习之字母R开头函数使用集锦:random/range/replace/reshape用法之详细攻略 random/range/replace/reshape用法 1.random用法 ...

  8. Python语言学习之字母S开头函数使用集锦:set/sys/super用法之详细攻略

    Python语言学习之字母S开头函数使用集锦:set/sys/super用法之详细攻略 set用法 set顾名思义是集合,里面不能包含重复的元素,接收一个list作为参数 list1=[1,2,3,4 ...

  9. Python语言学习:创建/删除文件/文件夹、获取当前文件/文件夹路径(系统环境路径/目录)、获取当前文件夹下的所有子文件路径等代码(os系列用法)实现之详细攻略

    Python语言学习:创建/删除文件/文件夹.获取当前文件/文件夹路径(系统环境路径/目录).获取当前文件夹下的所有子文件路径等代码(os系列用法)实现之详细攻略 目录 系统环境路径的设置 1.sys ...

最新文章

  1. springmvc+spring+mybatis+maven项目集成shiro进行用户权限控制【转】
  2. 计算机发展初期 承载信息的媒体,《多媒体技术与应用》(本)阶段练习一
  3. Python安装错误 building 'statsmodels. extensionerror: Microsoft Visual C++ 14.0 is
  4. mysql 事务 注意 优化_MySQL入门详解——事务、锁、优化
  5. mysql多表关联更新
  6. SAP loyalty management点击了公式超链接后的处理逻辑
  7. centos6安装composer
  8. 【微机原理与接口技术】学习笔记8 串行通信和8250芯片
  9. 《红孩儿引擎内功心法修练与Cocos2d-x》之结点系统(场景,层,精灵)(精)
  10. python pymysql mysql保存表情符
  11. 浏览器(2):自制Chromium内核浏览器,自动统计CSDN社区打卡记录
  12. mysql 创建用户、授权、修改密码
  13. springboot实现统一日志管理
  14. 【素描黑白】精致的IU手绘素描源码文件一键领取哦~
  15. 如何判断测试项目是否需要高频交直流电流探头
  16. matlab 播放声音,用matlab录音和放音
  17. Apriori算法Matlab实现
  18. ARGB_8888(ARGB32)色彩格式
  19. aria2搭建(CentOS 7)
  20. python例子高考志愿填报系统入口_江苏2018年高考模拟志愿填报入口(官方)

热门文章

  1. tp5 excel 导入 mysql_TP5框架下MySQL通过LOAD DATA INFILE批量导入数据详细操作
  2. ipad怎么连接电脑_蓝牙的使用,蓝牙耳机怎么连接手机,怎么连接电脑
  3. autojs怎么post协议_autojs QQ群post签到(五)
  4. java 文件字节流_Java:文件字符流和字节流的输入和输出
  5. Js - 复制 粘贴
  6. 获取视频的每一帧,并保存为.jpg图片
  7. if (argc == 1) 到底有什么作用?
  8. 了解 Boost Filesystem Library文件系统
  9. 将Sublime Text 3设置为Python全栈开发环境
  10. 利用Matlab优化工具箱解数独问题