英文源地址
关闭通道表示不再在该通道上发送任何值. 这对于将完成通信发送给通道的接收方非常有用.
package main
import "fmt"
func main() {
// 在这个例子中, 我们将使用一个jobs通道来将main协程要完成的工作传递给一个worker协程.
// 当我们没有更多的任务给worker时, 我们就close jobs channel.
jobs := make(chan int, 5)
done := make(chan bool)
// 这是worker协程.它不断重复用j接收jobs.
// 在这个特殊的2值接收形式中, 如果jobs被关闭了且通道中所有值已经接收, 则more值为false.
// 当我们完成所有的jobs时, 我们用它在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个job到worker, 然后关闭jobs通道
for j := 0; j <= 3; j++ {
jobs <- j
fmt.Println("sent job", j)
}
close(jobs)
fmt.Println("sent all jobs")
// 我们使用前面看到过的同步方式异步等待worker完成
<-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
已关闭的通道概念自然会引出我们的下一个示例: 通道上的range操作.