0

0

Go 中遍历已关闭通道的所有值:使用 range 语句的正确方式

聖光之護

聖光之護

发布时间:2026-01-08 16:04:09

|

103人浏览过

|

来源于php中文网

原创

Go 中遍历已关闭通道的所有值:使用 range 语句的正确方式

go 中,可通过 `for range` 直接遍历通道,循环会自动在通道关闭且所有已发送值被接收后终止,代码更简洁、语义更清晰,避免手动管理“是否已关闭”状态。

Go 的通道(channel)是协程间通信的核心机制,而安全、高效地消费通道中的全部数据,是并发编程的常见需求。当一个 goroutine 向通道发送若干值并最终调用 close(c) 后,其他 goroutine 可通过 range 语句一次性接收所有已发送但尚未被读取的值——无需显式检查通道状态或处理接收的第二个返回值(ok 值)。

如以下优化后的示例所示:

package main

import "fmt"

func pinger(c chan string) {
    for i := 0; i < 3; i++ {
        c <- "ping"
    }
    close(c) // 关闭通道,表示不再发送新值
}

func main() {
    c := make(chan string)

    go pinger(c)

    // ✅ 推荐写法:使用 range 自动处理关闭逻辑
    for msg := range c {
        fmt.Println(msg) // 输出三次 "ping"
    }
    // 循环结束后,c 已空且已关闭,后续再 range 将立即退出
}

⚠️ 注意事项:

如此AI员工
如此AI员工

国内首个全链路营销获客AI Agent

下载
  • range 只适用于已关闭的通道;若通道永不关闭,for range 将永久阻塞;
  • range 仅接收值,不暴露接收是否成功的布尔结果(即不等价于 v, ok :=
  • 若需在关闭前中断遍历(如超时或错误退出),应改用带 select 的显式接收循环;
  • 切勿在多个 goroutine 中对同一通道执行 range —— 这会导致竞态,因为 range 内部隐式循环接收,而通道不能被并发消费。

总结:for v := range ch 是 Go 中遍历通道的标准惯用法,它既精简了代码,又准确表达了“消费所有可用值直至通道关闭”的语义,是 Go 并发模式中值得熟练掌握的基础技巧。

相关专题

更多
Golang channel原理
Golang channel原理

本专题整合了Golang channel通信相关介绍,阅读专题下面的文章了解更多详细内容。

247

2025.11.14

golang channel相关教程
golang channel相关教程

本专题整合了golang处理channel相关教程,阅读专题下面的文章了解更多详细内容。

342

2025.11.17

html编辑相关教程合集
html编辑相关教程合集

本专题整合了html编辑相关教程合集,阅读专题下面的文章了解更多详细内容。

37

2026.01.21

三角洲入口地址合集
三角洲入口地址合集

本专题整合了三角洲入口地址合集,阅读专题下面的文章了解更多详细内容。

17

2026.01.21

AO3中文版入口地址大全
AO3中文版入口地址大全

本专题整合了AO3中文版入口地址大全,阅读专题下面的的文章了解更多详细内容。

221

2026.01.21

妖精漫画入口地址合集
妖精漫画入口地址合集

本专题整合了妖精漫画入口地址合集,阅读专题下面的文章了解更多详细内容。

59

2026.01.21

java版本选择建议
java版本选择建议

本专题整合了java版本相关合集,阅读专题下面的文章了解更多详细内容。

3

2026.01.21

Java编译相关教程合集
Java编译相关教程合集

本专题整合了Java编译相关教程,阅读专题下面的文章了解更多详细内容。

14

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

6

2026.01.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 4万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号