Golang?channel關(guān)閉后是否可以讀取剩余的數(shù)據(jù)詳解
golang channel關(guān)閉后,其中剩余的數(shù)據(jù),是可以繼續(xù)讀取的。
請看下面的測試?yán)印?/p>
創(chuàng)建一個帶有緩沖的channel,向channel中發(fā)送數(shù)據(jù),然后關(guān)閉channel,最后,從channel中讀取數(shù)據(jù),輸出結(jié)果。
package main
import (
"fmt"
)
func main(){
ch := make(chan int, 3)
ch <-1
ch <-2
ch <-3
close(ch)
for value := range ch {
fmt.Println("value:", value)
}
}output:
value: 1
value: 2
value: 3
可以看到,channel關(guān)閉之后,仍然可以從channel中讀取剩余的數(shù)據(jù),直到數(shù)據(jù)全部讀取完成。
多說一點,對于一個關(guān)閉的channel,如果繼續(xù)向channel發(fā)送數(shù)據(jù),會引起panic。
如果繼續(xù)讀數(shù)據(jù),得到的是零值(對于int,就是0)。
判斷一個channel的方式有兩種:
一種方式:
value, ok := <- ch
ok是false,就表示已經(jīng)關(guān)閉。
另一種方式,就是上面例子中使用的方式:
for value := range ch {
}如果channel被關(guān)閉,會跳出循環(huán)。
另外,如果channel被關(guān)閉后,不能再寫入,寫入會導(dǎo)致panic。但可以一直讀取,讀取到的值是類型的零值:
for i:=0;i<10;i++ {
value := <- ch
fmt.Println("value:", value)
}value: 1
value: 2
value: 3
value: 0
value: 0
value: 0
value: 0
value: 0
value: 0
value: 0
到此這篇關(guān)于Golang channel關(guān)閉后是否可以讀取剩余的數(shù)據(jù)詳解的文章就介紹到這了,更多相關(guān)Golang channel關(guān)閉內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語言中雙Token登錄系統(tǒng)的思路與實現(xiàn)詳解
在現(xiàn)代Web應(yīng)用中,身份認(rèn)證是保障系統(tǒng)安全的重要環(huán)節(jié),本文將介紹如何使用Go語言實現(xiàn)雙Token登錄系統(tǒng),文中的示例代碼講解詳細(xì),需要的可以了解下2025-07-07
go語言VScode?see?'go?help?modules'?(exit?statu
最近上手學(xué)習(xí)go語言,準(zhǔn)備在VSCode上寫程序的時候卻發(fā)現(xiàn)出了一點問題,下面這篇文章主要給大家介紹了關(guān)于go語言VScode?see?'go?help?modules'(exit?status?1)問題的解決過程,需要的朋友可以參考下2022-07-07
golang通過遞歸遍歷生成樹狀結(jié)構(gòu)的操作
這篇文章主要介紹了golang通過遞歸遍歷生成樹狀結(jié)構(gòu)的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04
一文帶你了解Go語言fmt標(biāo)準(zhǔn)庫輸出函數(shù)的使用
這篇文章主要為大家詳細(xì)介紹了Go語言中 fmt 標(biāo)準(zhǔn)庫輸出函數(shù)的使用,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2022-12-12

