在线文档 > Golang练习 > 通道关闭
在Go中, 使用close
关键字,表示 关闭 一个通道后不会再有值被发送到其中。这可用于向通道的接收者通知完成操作。
package main
import "fmt"
// 在这个例子中,我们将使用 jobs 通道来将要执行的工作从 main() 协程 发送到一个 worker 协程 中。
// 当没有更多工作可供 worker 执行时,我们将 关闭 jobs 通道。
func main() {
jobs := make(chan int, 5)
done := make(chan bool)
//这是 worker 协程。它使用 `j, more := <-jobs` 重复从 `jobs` 通道接收值。
// 在这个特殊的 2 值接收形式中,如果通道已经被 `close` ,并且通道中的所有值都已经被接收,则 `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` 通道向 worker 发送 3 个工作,然后关闭通道。
for j := 1; 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
。