Go by Example: Closing Channels关闭通道

英文源地址
关闭通道表示不再在该通道上发送任何值. 这对于将完成通信发送给通道的接收方非常有用.

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操作.

猜你喜欢

转载自blog.csdn.net/weixin_43547795/article/details/130870883