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ù)全部讀取完成。
多說一點(diǎn),對于一個關(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)文章
重學(xué)Go語言之?dāng)?shù)組的具體使用詳解
Go的數(shù)組是一種復(fù)合數(shù)據(jù)類型,在平時開發(fā)中并不常用,更常用的是切片(slice),可以把切片看作是能動態(tài)擴(kuò)容的數(shù)組,切片的底層數(shù)據(jù)結(jié)構(gòu)就是數(shù)組,所以數(shù)組雖不常用,但仍然有必要掌握2023-02-02Golang實(shí)現(xiàn)讀取excel文件并轉(zhuǎn)換為JSON格式
本文介紹了如何使用Golang讀取Excel文件并將其轉(zhuǎn)換為JSON格式,通過安裝excelize依賴和創(chuàng)建readExcelToJSON方法,可以實(shí)現(xiàn)這一功能,如果需要轉(zhuǎn)換數(shù)據(jù)類型,可以修改相應(yīng)的代碼,需要的朋友可以參考下2025-03-03Golang實(shí)現(xiàn)web文件共享服務(wù)的示例代碼
這篇文章主要介紹了Golang實(shí)現(xiàn)web文件共享服務(wù)的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-10-10Golang設(shè)計模式之責(zé)任鏈模式講解和代碼示例
責(zé)任鏈?zhǔn)且环N行為設(shè)計模式, 允許你將請求沿著處理者鏈進(jìn)行發(fā)送, 直至其中一個處理者對其進(jìn)行處理,本文就詳細(xì)給大家介紹一下Golang 責(zé)任鏈模式,文中有詳細(xì)的代碼示例,需要的朋友可以參考下2023-06-06Go語言常見數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)詳解
這篇文章主要為大家學(xué)習(xí)介紹了Go語言中的常見數(shù)據(jù)結(jié)構(gòu)(channal、slice和map)的實(shí)現(xiàn),文中的示例代碼簡潔易懂,需要的可以參考一下2023-07-07