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