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
,不然將有一直阻塞的風險。
中文、數字、英文字母
的字符串