一、正常的 channel
首先我們先來一段正常操作的代碼:

這段代碼應(yīng)該非常熟悉,這樣寫是否有問題呢?
執(zhí)行后的結(jié)果:

如果一個 channel 不在某個協(xié)程里面關(guān)閉的話,我們的 for range 就會報死鎖的錯誤。
二、關(guān)閉后再讀取
1、使用 for range 讀取關(guān)閉后的 channel
現(xiàn)在我們在 for range 之前關(guān)閉下這個 channel,看會出現(xiàn)啥情況:

這樣寫代碼會出現(xiàn)啥問題呢?

啥錯也沒有,正常的讀取。
2、直接獨立取值
下面我們換直接獨立取值的方式:

state 會返回是否取到了值,這段代碼的執(zhí)行結(jié)果是取到第一個值:

如果我們反復(fù)讀取呢?

我前面讀取 3 次,把里面的數(shù)據(jù)讀取完畢后,再讀取得到就是零值了。

所以結(jié)論是:如果 channel 有元素還未讀,會正確讀出來,哪怕他已經(jīng)關(guān)閉了。
三、往里面寫值呢?
最后一起來看下,當(dāng) channel 關(guān)閉后,往里面寫值會怎樣?

這段代碼執(zhí)行后的結(jié)果:

會報 panic,具體原因我們可以看 go 的源碼,路徑為:src/runtime/chan.go

你學(xué)廢了么?
審核編輯:劉清
-
Channel
+關(guān)注
關(guān)注
0文章
32瀏覽量
12407 -
go語言
+關(guān)注
關(guān)注
1文章
159瀏覽量
9778
發(fā)布評論請先 登錄
aducm360采樣率大于200Hz以上時,就會出現(xiàn)讀取的數(shù)據(jù)錯誤是為什么?怎么解決?
使用ADS1256中出現(xiàn)重新上電會出現(xiàn)讀取AD值不一樣的情況,怎么解決?
請問AFE4400讀取的數(shù)據(jù)什么時候才會出現(xiàn)0?
串口通訊 不間斷的會出現(xiàn)數(shù)據(jù)中斷
modbus通訊會出現(xiàn)讀取失敗是什么情況
當(dāng)變頻器將進線缺相保護關(guān)閉,出現(xiàn)缺相運行會出現(xiàn)什么情況?
水泵為什么會出現(xiàn)燒電機的情況?
兩個IGBT為什么會出現(xiàn)同時導(dǎo)通的情況呢?
螺桿式冷水機蒸發(fā)器出現(xiàn)故障會出現(xiàn)什么問題
自動無功補償裝置關(guān)閉后會出現(xiàn)什么狀況?
請教關(guān)于LVDS阻抗匹配的問題 LVDS輸出阻抗偏大會出現(xiàn)什么情況?
當(dāng)信號源的幅度過大,在兩級放大器的輸出端分別會出現(xiàn)什么情況?
MCX射頻頭使用不當(dāng)會出現(xiàn)什么情況
當(dāng)channel關(guān)閉后再去讀取數(shù)據(jù)會出現(xiàn)啥情況
評論