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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值