关闭channel由发送方执行,使用close()函数,接收方不应关闭;关闭后可读取剩余数据,随后返回零值,向已关闭channel发送数据会引发panic。

在Go语言中,channel 是实现goroutine之间通信的重要机制。理解如何正确关闭 channel 以及如何安全地循环读取数据,是编写健壮并发程序的关键。
关闭Channel的规则
关闭 channel 表示不再有值发送到该 channel。尝试向已关闭的 channel 发送数据会引发 panic,而从已关闭的 channel 读取仍可进行,会依次返回剩余数据,之后返回零值。
通常由发送方负责关闭 channel,接收方不应关闭它。使用 close() 函数来关闭 channel:
ch := make(chan int, 3)ch <- 1ch <- 2close(ch)
使用for-range循环读取channel
for-range 可以自动检测 channel 是否关闭。当 channel 关闭且所有数据被读取后,循环自动退出。
立即学习“go语言免费学习笔记(深入)”;
示例:启动一个goroutine发送数据并关闭channel,主函数用range读取:
Shakker
多功能AI图像生成和编辑平台
103 查看详情
func main() { ch := make(chan string, 2)go func() { ch <- "Hello" ch <- "World" close(ch) // 发送完成后关闭}()for msg := range ch { fmt.Println(msg)}// 输出:// Hello// World
}
通过逗号ok模式判断channel状态
如果不想使用 range,可以用 <-chan 配合 ok 判断是否关闭:
for { if msg, ok := <-ch; ok { fmt.Println(msg) } else { fmt.Println("Channel closed") break }}
实际应用场景:任务分发与结果收集
常见模式:多个worker从同一个channel读取任务,主程序关闭任务channel后等待结果。
func main() { tasks := make(chan int, 10) results := make(chan int, 10)// 启动workerfor w := 0; w < 3; w++ { go func() { for task := range tasks { results <- task * 2 } }()}// 发送任务for i := 1; i <= 5; i++ { tasks <- i}close(tasks) // 所有任务发送完毕,关闭// 收集结果for i := 0; i < 5; i++ { fmt.Println(<-results)}close(results)
}
基本上就这些。关键是记住:只由发送者关闭,接收者通过 range 或 ok 模式安全读取。避免重复关闭或向关闭的 channel 发送数据。
以上就是Golangchannel关闭与循环读取示例的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1137420.html
微信扫一扫
支付宝扫一扫