首頁 > 後端開發 > Golang > 主體

golang如何判斷channel已經close

發布: 2019-12-31 09:45:45
原創
2944 人瀏覽過

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中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!