- Go语言入门
- Go语言开发环境安装配置
- Go语言程序结构
- Go语言基础语法
- Go语言数据类型
- Go语言变量
- Go语言常量
- Go语言运算符
- Go语言条件和决策
- Go语言循环
- Go语言函数
- Go语言作用域规则
- Go语言字符串
- Go语言数组
- Go语言指针
- Go语言结构体
- Go语言切片
- Go语言范围(range)
- Go语言映射
- Go语言递归
- Go语言类型转换
- Go语言接口
- Go语言错误处理
-
Go编程代码实例
- Hello World程序实例
- Go变量实例
- Go常量实例
- Go for循环语句实例
- Go if/else语句实例
- Go switch语句实例
- Go切片实例
- Go范围实例
- Go函数实例
- Go函数多个返回值实例
- Go可变参数的函数实例
- Go闭包(匿名函数)实例
- Go函数递归实例
- Go指针实例
- Go指针实例
- Go接口实例
- Go错误实例
- Go程序实例
- Go通道实例
- Go通道缓冲实例
- Go通道同步实例
- Go通道路线实例
- Go Select实例
- Go超时(timeouts)实例
- Go非阻塞通道操作实例
- Go关闭通道实例
- Go通道范围实例
- Go计时器实例
- Go断续器实例
- Go工作池实例
- Go速率限制实例
- Go原子计数器实例
- Go互斥体实例
- Go有状态的goroutines实例
- Go排序实例
- Go按自定义函数排序实例
- Go panic错误处理实例
- Go延迟(defer)实例
- Go集合函数实例
- Go字符串函数实例
- Go字符串格式化实例
- Go正则表达式实例
- Go JSON实例
- Go时间日期实例
- Go时代(Epoch)实例
- Go时间格式化/解析实例
- Go随机数实例
- Go数字解析实例
- Go URL解析实例
- Go SHA1哈希实例
- Go Base64编码实例
- Go读取文件实例
- Go写文件实例
- Go行过滤器实例
- Go命令行参数实例
- Go命令行标志实例
- Go环境变量实例
- Go执行过程实例
- Go信号实例
- Go退出程序实例
Go关闭通道实例
关闭通道表示不会再发送更多值。这对于将完成通信到通道的接收器是很有用的。
在这个例子中,我们将使用一个作业通道来完成从main()
goroutine到worker
goroutine的工作。当没有更多的工作时,则将关闭工作通道。
这里是工作程序goroutine
。 它反复从j
的工作接收more := <-jobs
。在这种特殊的2
值形式的接收中,如果作业已关闭并且已经接收到通道中的所有值,则 more
的值将为 false
。当已经完成了所有的工作时,使用这个通知。
这会通过作业通道向工作线程发送3
个作业,然后关闭它。
等待工作程序,可使用前面看到的同步方法。
所有的示例代码,都放在
F:\worksp\golang
目录下。安装Go编程环境请参考:/tutorial/detail-5562.html
closing-channels.go
的完整代码如下所示 -
package main import "fmt" // In this example we'll use a `jobs` channel to // communicate work to be done from the `main()` goroutine // to a worker goroutine. When we have no more jobs for // the worker we'll `close` the `jobs` channel. func main() { jobs := make(chan int, 5) done := make(chan bool) // Here's the worker goroutine. It repeatedly receives // from `jobs` with `j, more := <-jobs`. In this // special 2-value form of receive, the `more` value // will be `false` if `jobs` has been `close`d and all // values in the channel have already been received. // We use this to notify on `done` when we've worked // all our jobs. go func() { for { j, more := <-jobs if more { fmt.Println("received job", j) } else { fmt.Println("received all jobs") done <- true return } } }() // This sends 3 jobs to the worker over the `jobs` // channel, then closes it. for j := 1; j <= 3; j++ { jobs <- j fmt.Println("sent job", j) } close(jobs) fmt.Println("sent all jobs") // We await the worker using the // [synchronization](channel-synchronization) approach // we saw earlier. <-done }
执行上面代码,将得到以下输出结果 -
F:\worksp\golang>go run closing-channels.go sent job 1 sent job 2 sent job 3 sent all jobs received job 1 received job 2 received job 3 received all jobs
上一篇:Go非阻塞通道操作实例
下一篇:Go通道范围实例