一、正常的 channel
首先我們先來一段正常操作的代碼:
這段代碼應(yīng)該非常熟悉,這樣寫是否有問題呢?
執(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)啥情況:
這樣寫代碼會(huì)出現(xiàn)啥問題呢?
啥錯(cuò)也沒有,正常的讀取。
2、直接獨(dú)立取值
下面我們換直接獨(dú)立取值的方式:
state 會(huì)返回是否取到了值,這段代碼的執(zhí)行結(jié)果是取到第一個(gè)值:
如果我們反復(fù)讀取呢?
我前面讀取 3 次,把里面的數(shù)據(jù)讀取完畢后,再讀取得到就是零值了。
所以結(jié)論是:如果 channel 有元素還未讀,會(huì)正確讀出來,哪怕他已經(jīng)關(guān)閉了。
三、往里面寫值呢?
最后一起來看下,當(dāng) channel 關(guān)閉后,往里面寫值會(huì)怎樣?
這段代碼執(zhí)行后的結(jié)果:
會(huì)報(bào) panic,具體原因我們可以看 go 的源碼,路徑為:src/runtime/chan.go
你學(xué)廢了么?
審核編輯:劉清
-
Channel
+關(guān)注
關(guān)注
0文章
31瀏覽量
12161 -
go語言
+關(guān)注
關(guān)注
1文章
159瀏覽量
9360
發(fā)布評(píng)論請(qǐng)先 登錄
aducm360采樣率大于200Hz以上時(shí),就會(huì)出現(xiàn)讀取的數(shù)據(jù)錯(cuò)誤是為什么?怎么解決?
使用ADS1256中出現(xiàn)重新上電會(huì)出現(xiàn)讀取AD值不一樣的情況,怎么解決?
請(qǐng)問AFE4400讀取的數(shù)據(jù)什么時(shí)候才會(huì)出現(xiàn)0?
串口通訊 不間斷的會(huì)出現(xiàn)數(shù)據(jù)中斷
mcuisp會(huì)出現(xiàn)芯片保護(hù)無法讀取的情況是為什么?
modbus通訊會(huì)出現(xiàn)讀取失敗是什么情況
當(dāng)變頻器將進(jìn)線缺相保護(hù)關(guān)閉,出現(xiàn)缺相運(yùn)行會(huì)出現(xiàn)什么情況?
水泵為什么會(huì)出現(xiàn)燒電機(jī)的情況?
不同的直流電機(jī)反接會(huì)出現(xiàn)什么情況
兩個(gè)IGBT為什么會(huì)出現(xiàn)同時(shí)導(dǎo)通的情況呢?

螺桿式冷水機(jī)蒸發(fā)器出現(xiàn)故障會(huì)出現(xiàn)什么問題

自動(dòng)無功補(bǔ)償裝置關(guān)閉后會(huì)出現(xiàn)什么狀況?
請(qǐng)教關(guān)于LVDS阻抗匹配的問題 LVDS輸出阻抗偏大會(huì)出現(xiàn)什么情況?
當(dāng)信號(hào)源的幅度過大,在兩級(jí)放大器的輸出端分別會(huì)出現(xiàn)什么情況?
MCX射頻頭使用不當(dāng)會(huì)出現(xiàn)什么情況

評(píng)論