学习golang(12) 初探:协程(3)多个chan之select选择器

简介: 学习golang(12) 初探:协程(3)多个chan之select选择器

我们近些天一直在看go协程,关于协程基础和协程间通信,请看之前的博文

初探理解select





什么是select选择器


什么是select选择器

select选择器和goswitch很相似,只不过select能够处理的对象是chan,那,我们为什么需要select呢,如果我们有多个chan在处理的时候,select可以帮助我们选择符合要求的chan,如果都满足要求,那就回随机选择一个返回。



语法对比一下select和switch


我们对比一下switchselect语法

对于switch而言,当多个case满足条件的时候,它会顺序执行,不做介入的情况下,执行完一个case后则退出switch, 而select则不同,当case条件满足的时候,它会随机执行case,具体我们看看案例。



switch 案例

switch

image.png


我们执行下看下结果

image.png


我们通过之前学习的结果可得,若case匹配成功,则会走响应的分支,无法匹配成功,则会走到default分支中。


select案例

反观select呢,我们写个例子看下

image.png


我们定义了2个无缓冲管道,一个是bool类型的,一个是int类型的,紧接着我们开启一个协程,中间接入了一个select,分别对boolChanintChan取值,最后我们等待3秒往boolChan发送true,又3秒,我们向intChan发送3,我们执行下,看下结果

image.png


这里简单介绍一下select机制,若在select中没有default分支,那么当没有case条件满足时,它会等待,等待所检测的管道有数据进来,若有default的时候,若执行当下select语句时,若不匹配任何case,则会执行default


我们再反过来看代码,我们由于没有在selectdefault分支,所以该语句会等,等某一个case条件匹配时,那正好,我们往boolChan发送了一个true,满足了该case,所以会执行“接收到bool chan 的值” , 好,执行完后,select就执行完毕了,我们再向intChan发送数字3,但是此时我们没有代码去做管道读取,所以会引发deadlock panic




小demo


通过上述案例,我们知晓了select在没有default分支的情况下,只会有一个case被满足,否则会一直等待,所以我们可以根据此案例,写一个发送撤回器。


即,我们写一个小demo,该demo会输出一个信息,我们若在10秒内不干预,则发送,否则撤销发送,

其中核心点,表示select了,我们在其中写入2个case

  • cancel bool
  • time.after

time.After会在多少时间后返回一个<-chan Time , 而cancel则需要我们自行输入,这意味着,若我们不介入撤销发送,则消息在规定的时间后会发送成功。

image.png


好,我们执行下代码

image.png

举一反三,我们甚至于利用select可以编写一个服务器心跳包。



总结


我们了解了什么是select,其实从某种意义来说,它和linux select多路复用有点异曲同工之妙,总的来讲,我们在设计的时候若不加入default分支,那么select会一直等待,等待某个case条件满足,满足后,执行分支,退出select,注意,当有多个case满足条件的时候,它会随机选择一个执行,而非顺序执行哦。










相关文章
|
6月前
|
缓存 机器人 Go
Golang 语言 beego 学习之安装和快速入门
Golang 语言 beego 学习之安装和快速入门
37 0
|
1月前
|
SQL 前端开发 Go
编程笔记 GOLANG基础 001 为什么要学习Go语言
编程笔记 GOLANG基础 001 为什么要学习Go语言
|
6月前
|
存储 Go API
100天精通Golang(基础入门篇)——第7天:深入学习键盘输入和打印输出,掌握常用函数和包
100天精通Golang(基础入门篇)——第7天:深入学习键盘输入和打印输出,掌握常用函数和包
40 0
|
8月前
|
Go
golang面试官:for select时,如果通道已经关闭会怎么样?如果select中只有一个case呢?
golang面试官:for select时,如果通道已经关闭会怎么样?如果select中只有一个case呢?
93 1
|
3月前
|
存储 算法 Java
Golang底层原理剖析之多路select、channel数据结构和阻塞与非阻塞
Golang底层原理剖析之多路select、channel数据结构和阻塞与非阻塞
21 0
|
6月前
|
Java Go C语言
100天精通Golang(基础入门篇)——第2天:学习Go语言的前世今生:一门强大的编程语言的崛起
100天精通Golang(基础入门篇)——第2天:学习Go语言的前世今生:一门强大的编程语言的崛起
128 1
|
6月前
|
Rust Java Go
100天精通Golang(基础入门篇)——第1天:学习Go语言基本概念
100天精通Golang(基础入门篇)——第1天:学习Go语言基本概念
82 0
|
6月前
|
编译器 Go 开发者
100天精通Golang(基础入门篇)——第0天:安装Go语言开发环境的基础教程,带你学习Golang之Hello Go!
100天精通Golang(基础入门篇)——第0天:安装Go语言开发环境的基础教程,带你学习Golang之Hello Go!
69 0
|
6月前
|
存储 Java Go
100天精通Golang(基础入门篇)——第5天: Go语言中的数据类型学习
100天精通Golang(基础入门篇)——第5天: Go语言中的数据类型学习
51 0
|
7月前
|
Rust Java 程序员
程序员为什么要学习Golang语言?有哪些优势?原因有5点
程序员为什么要学习Golang语言?有哪些优势?原因有5点