讀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)
}
}
}()
參考鏈接:https://blog.csdn.net/u013870094/article/details/78608607