對已經關閉的的 chan
進行讀寫,會怎麼樣?爲何?golang
chan
能一直讀到東西,可是讀到的內容根據通道內
關閉前
是否有元素而不一樣。
chan
關閉前,
buffer
內有元素
還未讀 , 會正確讀到
chan
內的值,且返回的第二個 bool 值(是否讀成功)爲
true
。
chan
關閉前,
buffer
內有元素
已經被讀完,
chan
內無值,接下來全部接收的值都會非阻塞直接成功,返回
channel
元素的
零值,可是第二個
bool
值一直爲
false
。
chan
會
panic
send on closed channel
,待會會提到。
1. 爲何寫已經關閉的 chan
就會 panic
呢? web
c.closed != 0
則爲通道關閉,此時執行寫,源碼提示直接 panic,輸出的內容就是上面提到的
"send on closed channel"
。
2. 爲何讀已關閉的 chan
會一直能讀到值? 面試
c.closed != 0 && c.qcount == 0
指通道已經關閉,且緩存爲空的狀況下(已經讀完了以前寫到通道里的值)
ep
不爲空
typedmemclr
會
根據類型清理相應地址的內存
chan
會返回對應類型的零值
中文、數字、英文字母
的字符串