关闭通道表示不再向其发送值。这对于向通道的接收者传达完成状态非常有用。
package main
import "fmt"
// 在这个示例中,我们将使用一个 jobs 通道将待处理的工作从 main() goroutine 传递到 worker goroutine。当我们没有更多的工作要分配给 worker 时,我们将关闭 jobs 通道。
func main() {
jobs := make(chan int, 5)
done := make(chan bool)
// 这是 worker goroutine。它通过 j, more := <-jobs 反复从 jobs 通道接收。在这种特殊的接收形式中,当 jobs 通道被关闭且所有值都已被接收时,more 的值将为 false。我们利用这一点来通知任务完成,当我们处理完所有工作时。
go func() {
for {
j, more := <-jobs
if more {
fmt.Println("received job", j)
} else {
fmt.Println("received all jobs")
done <- true
return
}
}
}()
// 这通过 jobs 通道向 worker 发送 3 个工作任务,然后关闭通道。
for j := 1; j <= 3; j++ {
jobs <- j
fmt.Println("sent job", j)
}
close(jobs)
fmt.Println("sent all jobs")
// 我们使用之前看到的同步方法等待 worker。
<-done
// 从关闭的通道读取会立即成功,返回底层类型的零值。可选的第二个返回值为 true,如果接收到的值是通过成功的发送操作传递到通道的;如果接收到的是因为通道已关闭且为空而生成的零值,则第二个返回值为 false。
_, ok := <-jobs
fmt.Println("received more jobs:", ok)
}
运行结果:
$ 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
received more jobs: false
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。