for
循环select
时,若是通道已经关闭会怎么样?若是select
中的case
只有一个,又会怎么样?golang
select
时,若是其中一个case通道已经关闭,则每次都会执行到这个case。
c通道
是一个缓冲为
0
的通道,在
main
开始时,启动一个协程对
c通道
写入
10
,而后就关闭掉这个通道。
main
中经过
x, ok := <-c
接受
通道c
里的值,从输出结果里看出,确实从通道里读出了以前塞入通道的
10
,可是在通道关闭后,这个通道一直能读出内容。
x, ok := <-c
返回的值里第一个x是通道内的值,
ok
是指通道是否关闭,当通道被关闭后,
ok
则返回
false
,所以能够根据这个进行操做。读一个已经关闭的通道为何会出现false,能够看我以前的
对已经关闭的的chan进行读写,会怎么样?为何? 。
ok
为
false
时,执行
c = nil
将通道置为
nil
,至关于读一个未初始化的通道,则会一直阻塞。至于为何读一个未初始化的通道会出现阻塞,能够看个人另外一篇
对未初始化的的chan进行读写,会怎么样?为何? 。
select
中若是任意某个通道有值可读时,它就会被执行,其余被忽略。则
select
会跳过这个阻塞
case
,能够解决不断读已关闭通道的问题。
case
的状况下,则会
死循环
。
case
那样,把通道置为
nil
就能解决问题了吗?
case
能读到通道里的
10
case
能读到通道已经关闭的信息。此时将通道置为
nil
case
时main协程会被阻塞,此时整个进程没有其余活动的协程了,进程
deadlock
select
中若是任意某个通道有值可读时,它就会被执行,其余被忽略。
default
字句,
select
将有可能阻塞,直到某个通道有值能够运行,因此
select
里最好有一个
default
,不然将有一直阻塞的风险。
中文、数字、英文字母
的字符串