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