概念簡介
關閉一個通道意味著不能再向這個通道發送值了。這個特性可以用來給這個通道的接收方傳達工作已經完成的信息。
例程代碼
package main
import "fmt"
// 在這個例子中,我們將使用一個 `jobs` 通道來傳遞 `main()` 中 Go
// 協程任務執行的結束信息到一個工作 Go 協程中。當我們沒有多餘的
// 任務給這個工作 Go 協程時,我們將 `close` 這個 `jobs` 通道。
func main() {
jobs := make(chan int, 5)
done := make(chan bool)
// 這是工作 Go 協程。使用 `j, more := <- jobs` 循環的從
// `jobs` 接收數據。在接收的這個特殊的二值形式的值中,
// 如果 `jobs` 已經關閉了,並且通道中所有的值都已經接收
// 完畢,那麽 `more` 的值將是 `false`。當我們完成所有
// 的任務時,將使用這個特性通過 `done` 通道去進行通知。
go func() {
for {
j, more := <-jobs
if more {
fmt.Println("received job", j)
} else {
fmt.Println("received all jobs")
done <- true
return
}
}
}()
// 這裏使用 `jobs` 發送 3 個任務到工作函數中,然後
// 關閉 `jobs`。
for j := 1; j <= 3; j++ {
jobs <- j
fmt.Println("sent job", j)
}
close(jobs)
fmt.Println("sent all jobs")
// 我們使用前麵學到的[通道同步](../channel-synchronization/)
// 方法等待任務結束。
<-done
}
執行&輸出
$ go run closing-channels.go
sent job 1
received job 1
sent job 2
received job 2
sent job 3
received job 3
sent all jobs
received all jobs
# 通過關閉通道的學習,也讓下麵學習通道遍曆水到渠成。
課程導航
學習上一篇:Go語言教程:非阻塞通道操作 學習下一篇:Go語言教程:通道遍曆
相關資料
本例程github源代碼:https://github.com/xg-wang/gobyexample/tree/master/examples/closing-channels