一、正常的 channel
首先我們先來(lái)一段正常操作的代碼:
這段代碼應(yīng)該非常熟悉,這樣寫(xiě)是否有問(wèn)題呢?
執(zhí)行后的結(jié)果:
如果一個(gè) channel 不在某個(gè)協(xié)程里面關(guān)閉的話,我們的 for range 就會(huì)報(bào)死鎖的錯(cuò)誤。
二、關(guān)閉后再讀取
1、使用 for range 讀取關(guān)閉后的 channel
現(xiàn)在我們?cè)?for range 之前關(guān)閉下這個(gè) channel,看會(huì)出現(xiàn)啥情況:
這樣寫(xiě)代碼會(huì)出現(xiàn)啥問(wèn)題呢?
啥錯(cuò)也沒(méi)有,正常的讀取。
2、直接獨(dú)立取值
下面我們換直接獨(dú)立取值的方式:
state 會(huì)返回是否取到了值,這段代碼的執(zhí)行結(jié)果是取到第一個(gè)值:
如果我們反復(fù)讀取呢?
我前面讀取 3 次,把里面的數(shù)據(jù)讀取完畢后,再讀取得到就是零值了。
所以結(jié)論是:如果 channel 有元素還未讀,會(huì)正確讀出來(lái),哪怕他已經(jīng)關(guān)閉了。
三、往里面寫(xiě)值呢?
最后一起來(lái)看下,當(dāng) channel 關(guān)閉后,往里面寫(xiě)值會(huì)怎樣?
這段代碼執(zhí)行后的結(jié)果:
會(huì)報(bào) panic,具體原因我們可以看 go 的源碼,路徑為:src/runtime/chan.go
你學(xué)廢了么?
審核編輯:劉清
-
Channel
+關(guān)注
關(guān)注
0文章
31瀏覽量
11819 -
go語(yǔ)言
+關(guān)注
關(guān)注
1文章
158瀏覽量
9053
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論