golang面試題:對已經關閉的的chan進行讀寫,會怎麼樣?爲何?

問題

已經關閉的的 chan 進行讀寫,會怎麼樣?爲何?golang

怎麼答

  • 已經關閉chan 能一直讀到東西,可是讀到的內容根據通道內關閉前是否有元素而不一樣。
    • 若是 chan 關閉前,buffer 內有元素還未讀 , 會正確讀到 chan 內的值,且返回的第二個 bool 值(是否讀成功)爲 true
    • 若是 chan 關閉前,buffer 內有元素已經被讀完chan 內無值,接下來全部接收的值都會非阻塞直接成功,返回 channel 元素的零值,可是第二個 bool 值一直爲 false
  • 已經關閉chanpanic

舉例

1. 寫已經關閉的 chan
  • 注意這個 send on closed channel,待會會提到。
2. 讀已經關閉的 chan

多問一句

1. 爲何寫已經關閉的 chan 就會 panic 呢? 面試

  • c.closed != 0 則爲通道關閉,此時執行寫,源碼提示直接 panic,輸出的內容就是上面提到的 "send on closed channel"

2. 爲何讀已關閉的 chan 會一直能讀到值? json

  • c.closed != 0 && c.qcount == 0 指通道已經關閉,且緩存爲空的狀況下(已經讀完了以前寫到通道里的值)
  • 若是接收值的地址 ep 不爲空
    • 那接收值將得到是一個該類型的零值
    • typedmemclr根據類型清理相應地址的內存
    • 這就解釋了上面代碼爲何關閉的 chan 會返回對應類型的零值

文章推薦:

若是你想天天學習一個知識點?
相關文章
相關標籤/搜索