一、正常的 channel
首先我們先來一段正常操作的代碼:
這段代碼應該非常熟悉,這樣寫是否有問題呢?
執行后的結果:
如果一個 channel 不在某個協程里面關閉的話,我們的 for range 就會報死鎖的錯誤。
二、關閉后再讀取
1、使用 for range 讀取關閉后的 channel
現在我們在 for range 之前關閉下這個 channel,看會出現啥情況:
這樣寫代碼會出現啥問題呢?
啥錯也沒有,正常的讀取。
2、直接獨立取值
下面我們換直接獨立取值的方式:
state 會返回是否取到了值,這段代碼的執行結果是取到第一個值:
如果我們反復讀取呢?
我前面讀取 3 次,把里面的數據讀取完畢后,再讀取得到就是零值了。
所以結論是:如果 channel 有元素還未讀,會正確讀出來,哪怕他已經關閉了。
三、往里面寫值呢?
最后一起來看下,當 channel 關閉后,往里面寫值會怎樣?
這段代碼執行后的結果:
會報 panic,具體原因我們可以看 go 的源碼,路徑為:src/runtime/chan.go
你學廢了么?
審核編輯:劉清
-
Channel
+關注
關注
0文章
31瀏覽量
11861 -
go語言
+關注
關注
1文章
158瀏覽量
9094
發布評論請先 登錄
相關推薦
aducm360采樣率大于200Hz以上時,就會出現讀取的數據錯誤是為什么?怎么解決?
使用ADS1256中出現重新上電會出現讀取AD值不一樣的情況,怎么解決?
請問AFE4400讀取的數據什么時候才會出現0?
modbus通訊會出現讀取失敗是什么情況
兩個IGBT為什么會出現同時導通的情況呢?
![兩個IGBT為什么<b class='flag-5'>會出現</b>同時導通的<b class='flag-5'>情況</b>呢?](https://file.elecfans.com/web1/M00/DA/99/pIYBAF_-sBCAUvn5AAApWxSKJ5w979.png)
自動無功補償裝置關閉后會出現什么狀況?
請教關于LVDS阻抗匹配的問題 LVDS輸出阻抗偏大會出現什么情況?
當信號源的幅度過大,在兩級放大器的輸出端分別會出現什么情況?
MCX射頻頭使用不當會出現什么情況
![MCX射頻頭使用不當<b class='flag-5'>會出現</b>什么<b class='flag-5'>情況</b>](https://file1.elecfans.com/web2/M00/09/1A/wKgaomb2BLOAQABkAADMIykWClc762.png)
評論