清華尹成帶你實戰GO案例(30)Go 關閉通道

尹成發表於2018-05-22
Go 關閉通道
關閉通道的意思是該通道將不再允許寫入資料。這個方法可以讓通道資料的接受端知道資料已經全部傳送
完成了。
package main
import "fmt"
// 在這個例子中,我們使用通道jobs在main函式所在的協程和一個資料
// 接收端所在的協程通訊。當我們資料傳送完成後,我們關閉jobs通道
func main() {
jobs := make(chan int, 5)
done := make(chan bool)
// 這裡是資料接收端協程,它重複使用`j, more := <-jobs`來從通道
// jobs獲取資料,這裡的more在通道關閉且通道中不再有資料可以接收的
// 時候為false,我們通過判斷more來決定所有的資料是否已經接收完成。
// 如果所有資料接收完成,那麼向done通道寫入true
go func() {
for {
j, more := <-jobs
if more {
fmt.Println("received job", j)
} else {
fmt.Println("received all jobs")
done <- true
return
}
}
}()
// 這裡向jobs通道寫入三個資料,然後關閉通道
for j := 1; j <= 3; j++ {
jobs <- j
fmt.Println("sent job", j)
}
close(jobs)
fmt.Println("sent all jobs")
// 我們知道done通道在接收資料的時候會阻塞,所以在所有的資料傳送
// 接收完成後,寫入done的資料將在這裡被接收,然後程式結束。
<-done
}


執行結果

sent job 1
received job 1
sent job 2
sent job 3
sent all jobs
received job 2
received job 3

received all jobs





網址:http://www.qukuailianxueyuan.io/



欲領取造幣技術與全套虛擬機器資料

區塊鏈技術交流QQ群:756146052  備註:CSDN

尹成學院微信:備註:CSDN



網址:http://www.qukuailianxueyuan.io/



欲領取造幣技術與全套虛擬機器資料

區塊鏈技術交流QQ群:756146052  備註:CSDN

尹成學院微信:備註:CSDN

相關文章