0

0

Go 中使用 range 迭代关闭前的通道值

心靈之曲

心靈之曲

发布时间:2026-01-08 16:34:30

|

808人浏览过

|

来源于php中文网

原创

Go 中使用 range 迭代关闭前的通道值

go 语言中,可通过 `for range` 语法简洁、安全地遍历通道(channel)中所有已发送且未接收的值,该循环自动在通道关闭后终止,无需手动检查接收状态。

Go 的通道(channel)是协程间通信的核心机制,而正确消费通道中的全部数据是常见需求。传统方式如 msg, ok :=

当对通道使用 for range c 时,循环会持续接收值,直到通道被显式关闭(close(c))且缓冲区/待接收值全部耗尽。此时循环自动退出,无需额外逻辑或状态变量。注意:仅当通道被关闭后,range 才会结束;向已关闭通道发送值会 panic,但从已关闭通道接收值是安全的(返回零值 + false)

以下是优化后的完整示例:

堆友
堆友

Alibaba Design打造的设计师全成长周期服务平台,旨在成为设计师的好朋友

下载
package main

import "fmt"

func pinger(c chan string) {
    for i := 0; i < 3; i++ {
        c <- "ping"
    }
    close(c) // 必须关闭,否则 range 将永远阻塞
}

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

    go pinger(c)

    // ✅ 推荐写法:简洁、清晰、不易出错
    for msg := range c {
        fmt.Println(msg) // 输出三次 "ping"
    }
}

⚠️ 重要注意事项:

  • 必须确保有 goroutine 负责关闭通道 —— range 不会主动关闭通道,也无超时或自动终止机制;
  • 禁止向已关闭通道发送数据,否则运行时 panic;
  • 若通道为带缓冲通道(如 make(chan string, 2)),range 仍能正确接收所有已入队值并等待关闭后退出;
  • range 仅适用于接收端;不能用于向通道发送值(即 for v := range c { c

总结:for range c 是 Go 中迭代通道的标准范式,它将“接收 + 关闭检测”逻辑内聚封装,显著提升代码可读性与健壮性,应作为首选方案替代手动状态管理。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

315

2023.08.02

Golang channel原理
Golang channel原理

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

244

2025.11.14

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

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

342

2025.11.17

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

3

2026.01.09

c++框架学习教程汇总
c++框架学习教程汇总

本专题整合了c++框架学习教程汇总,阅读专题下面的文章了解更多详细内容。

7

2026.01.09

学python好用的网站推荐
学python好用的网站推荐

本专题整合了python学习教程汇总,阅读专题下面的文章了解更多详细内容。

10

2026.01.09

学python网站汇总
学python网站汇总

本专题整合了学python网站汇总,阅读专题下面的文章了解更多详细内容。

1

2026.01.09

python学习网站
python学习网站

本专题整合了python学习相关推荐汇总,阅读专题下面的文章了解更多详细内容。

4

2026.01.09

俄罗斯手机浏览器地址汇总
俄罗斯手机浏览器地址汇总

汇总俄罗斯Yandex手机浏览器官方网址入口,涵盖国际版与俄语版,适配移动端访问,一键直达搜索、地图、新闻等核心服务。

9

2026.01.09

热门下载

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

精品课程

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

共32课时 | 3.5万人学习

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号