首頁  >  文章  >  後端開發  >  golang如何判斷channel已經close

golang如何判斷channel已經close

尚
原創
2019-12-31 09:45:452962瀏覽

golang如何判斷channel已經close

channel有點類似管道,它在goroutine同步與通訊中,有著起承轉合的作用,同時也是Golang實現CSP模型的關鍵。

golang 中大部分型別都是值型別(只有slice / channel / map 是引用型別),讀/寫型別是值型別的channel 時,如果元素size 比較大時,應該用指標代替,避免頻繁的記憶體拷貝開銷。

golang判斷channel是否已經close的方法:

讀channel的時候判斷其是否已經關閉

_,ok := <- jobs

此時如果channel關閉,ok 值為false

寫入channel的時候判斷是否已關閉

1、_,ok := <- jobs

#此時如果channel 關閉,ok 值為false,如果channel 沒有關閉,則會遺漏一個jobs

2、使用select 方式

再建立一個channel,叫做timeout,如果超時往這個channel 發送true,在生產者發送資料給jobs 的channel,用select 監聽timeout,如果超時則關閉jobs 的channel.

go func() {
 time.Sleep(time.Second * 3)
 timeout <- true
 }()
go func() {
 for i := 0; ; i++ {
 select {
     case <-timeout:
         close(jobs)
         return
 
     default:
         jobs <- i
         fmt.Println("produce:", i)
         }
     }
 }()

更多golang知識請關注golang教程欄目。

以上是golang如何判斷channel已經close的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn