Go程序例子(6):关闭通道
Go程序例子(6):关闭通道
关闭通道表示不再向其发送值。这对于向通道的接收者传达完成状态非常有用。代码语言:go复制package main
import "fmt"
// 在这个示例中,我们将使用一个 jobs 通道将待处理的工作从 main() goroutine 传递到 worker goroutine。当我们没有更多的工作要分配给 worker 时,我们将关闭 j
Go程序例子(6):关闭通道
关闭通道表示不再向其发送值。这对于向通道的接收者传达完成状态非常有用。
代码语言:go复制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 发送 个工作任务,然后关闭通道。
for j := 1; j <= ; 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)
}
运行结果:
代码语言:javascript代码运行次数:0运行复制$ go run closing-channels.go
sent job 1
received job 1
sent job 2
received job 2
sent job
received job
sent all jobs
received all jobs
received more jobs: false
#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格
上传时间: 2025-07-27 18:21:14
上一篇:开发做前端好还是后端好?
下一篇:代码注释:程序员的隐形艺术
推荐阅读
留言与评论(共有 18 条评论) |
本站网友 汇安人才 | 29分钟前 发表 |
_ | |
本站网友 我去哪儿 | 12分钟前 发表 |
然后关闭通道 | |
本站网友 geshigongc | 7分钟前 发表 |
我们将关闭 jobs 通道 | |
本站网友 枫丹丽舍房价 | 26分钟前 发表 |
_ | |
本站网友 海尔商城网 | 22分钟前 发表 |
j) } else { fmt.Println("received all jobs") done <- true return } } }() // 这通过 jobs 通道向 worker 发送 个工作任务 | |
本站网友 梦见牙齿掉了是什么意思 | 11分钟前 发表 |
<-done // 从关闭的通道读取会立即成功 | |
本站网友 魅妆 | 13分钟前 发表 |
go func() { for { j | |
本站网友 流行性腮腺炎ppt | 30分钟前 发表 |
我们将使用一个 jobs 通道将待处理的工作从 main() goroutine 传递到 worker goroutine | |
本站网友 蜂蜜减肥方法 | 9分钟前 发表 |
= make(chan bool) // 这是 worker goroutine | |
本站网友 1段奶粉 | 24分钟前 发表 |
Go程序例子(6):关闭通道 关闭通道表示不再向其发送值 | |
本站网友 baidu指数 | 23分钟前 发表 |
more | |
本站网友 无锡房地产信息网 | 17分钟前 发表 |
more 的值将为 false | |
本站网友 万载县委书记 | 8分钟前 发表 |
j) } close(jobs) fmt.Println("sent all jobs") // 我们使用之前看到的同步方法等待 worker | |
本站网友 有效健康减肥方法 | 21分钟前 发表 |
= make(chan int | |
本站网友 桃仁的功效 | 25分钟前 发表 |
= make(chan int | |
本站网友 灰指甲图片 | 4分钟前 发表 |
代码语言:go复制package main import "fmt" // 在这个示例中 | |
本站网友 7fgame | 0秒前 发表 |
j) } close(jobs) fmt.Println("sent all jobs") // 我们使用之前看到的同步方法等待 worker |