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