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