Skip to content

20210304当要给select{case chs}结构中,管道在外部被关闭了

zqy edited this page Mar 4, 2021 · 1 revision

文章解释的很到位:

https://studygolang.com/articles/30873

重点在于不要忘记case a,b:=ch,其实是个多返回值的设计模式:

x, ok := <-c 返回的值里第一个x是通道内的值,ok是指通道是否关闭,当通道被关闭后,ok则返回false,因此可以根据这个进行相关操作。
读一个已经关闭的通道为什么会出现false,可以看我之前的 对已经关闭的的chan进行读写,会怎么样?为什么? 。
当返回的ok为false时,执行c = nil 将通道置为nil,相当于读一个未初始化的通道,则会一直阻塞。
至于为什么读一个未初始化的通道会出现阻塞,可以看我的另一篇 对未初始化的的chan进行读写,会怎么样?为什么?
select中如果任意某个通道有值可读时,它就会被执行,其他被忽略。则select会跳过这个阻塞case,可以解决不断读已关闭通道的问题

组合一个套路:
当ok ==false时让此管道=nil
于是其所在for{select{}}结构就不会出现死循环的问题,而对于之前的项目,似乎暂时用不到c=nil这一技巧
只要当ok==false时直接执行return与析构操作即可

Clone this wiki locally