Golangchannel关闭与循环读取示例

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

golangchannel关闭与循环读取示例

在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 Shakker

多功能AI图像生成和编辑平台

Shakker 103 查看详情 Shakker

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月2日 18:04:19
下一篇 2025年12月2日 18:04:40

相关推荐

发表回复

登录后才能评论
关注微信