如何在Golang中使用range遍历数据_range遍历语法说明

发布时间 - 2026-01-22 00:00:00    点击率:
range遍历切片时v是值副本,修改不影响原切片;遍历map顺序随机,需先排序key才能有序;遍历channel会阻塞至关闭,关闭后自动退出。

range 遍历切片时,v 是值的副本,不是引用

for _, v := range slice 中,v 每次迭代都会被重新赋值为当前元素的拷贝。修改 v 不会影响原切片内容:

nums := []int{1, 2, 3}
for _, v := range nums {
    v = v * 10 // 这行无效:只改了 v 的副本
}
// nums 仍是 [1, 2, 3]

若需修改原切片,必须通过索引访问:

  • for i := range slicefor i, _ := range slice
  • 再写 slice[i] = ...
  • 注意:如果切片底层数组被扩容(如 append 导致扩容),后续索引可能失效

range 遍历 map 时,遍历顺序不保证且每次不同

Go 规范明确要求 range 遍历 map 的顺序是随机的——这不是 bug,而是设计选择,用于防止程序依赖隐式顺序。

常见误判场景:

  • 测试中偶然看到固定顺序,误以为“稳定”,上线后出错
  • range map 构造 JSON 或日志输出,期望键有序,结果每次不同

若需有序遍历,得先提取 key 到切片并排序:

keys := make([]string, 0, len(m))
for k := range m {
    keys = append(keys, k)
}
sort.Strings(keys)
for _, k := range keys {
    fmt.Println(k, m[k])
}

range 遍历 channel 会阻塞直到有数据或 channel 关闭

for v := range ch 是典型的消费模式,但行为容易被低估:

  • channel 未关闭且无数据时,该 for 会永久阻塞(goroutine 泄漏风险)
  • channel 关闭后,循环自动退出,不会返回零值
  • 不能用 break 提前退出后再从同一 channel 继续 range —— 已关闭的 channel 无法重开

安全做法:

  • 确保有 goroutine 负责 close(ch),且所有发送完成后再关
  • 避免在多个 goroutine 中对同一 channel 使用 range(竞态)
  • 若需非阻塞尝试,改用 select { case v, ok :=

range 在字符串上遍历的是 rune,不是 byte

Go 字符串底层是 UTF-8 字节数组,但 range 会自动解码为 Unicode 码点(rune):

s :

= "你好" for i, r := range s { fmt.Printf("index=%d, rune=%U\n", i, r) // 输出: // index=0, rune=U+4F60 // index=3, rune=U+597D }

注意:i 是字节偏移,不是 rune 索引;rrune 类型,不是 byte

  • 想按字符数计数?用 utf8.RuneCountInString(s)
  • 想截取前 N 个字符?不能直接 s[:n],要用 []rune(s)[:n] 再转回 string
  • 若误把 range 当作 byte 遍历,处理 ASCII 没问题,一遇到中文就索引错位

实际写 range 循环时,最常忽略的是「谁拥有数据所有权」和「谁控制生命周期」——切片的底层数组、map 的并发安全性、channel 的关闭时机、字符串的编码边界,都藏在看似简单的语法糖下面。


# js  # json  # go  # golang  # app  # for  # select  # break  # 循环  # 切片  # append  # map  # channel  # bug  # 遍历  # 的是  # 若需  # 多个  # 这不是  # 仍是  # 要用  # 不能用  # 藏在  # 至关 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251811 】 【 AI营销90571


相关推荐: JS中对数组元素进行增删改移的方法总结  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】  昵图网官方站入口 昵图网素材图库官网入口  如何选择可靠的免备案建站服务器?  Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转  大同网页,大同瑞慈医院官网?  Laravel如何创建自定义中间件?(Middleware代码示例)  微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  zabbix利用python脚本发送报警邮件的方法  PythonWeb开发入门教程_Flask快速构建Web应用  微信小程序 canvas开发实例及注意事项  Linux安全能力提升路径_长期防护思维说明【指导】  在线制作视频的网站有哪些,电脑如何制作视频短片?  google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤  为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】  网站优化排名时,需要考虑哪些问题呢?  如何在阿里云ECS服务器部署织梦CMS网站?  高端建站三要素:定制模板、企业官网与响应式设计优化  Laravel如何升级到最新版本?(升级指南和步骤)  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  JavaScript如何实现继承_有哪些常用方法  手机网站制作与建设方案,手机网站如何建设?  Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道  如何快速启动建站代理加盟业务?  nginx修改上传文件大小限制的方法  标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南  Mybatis 中的insertOrUpdate操作  如何在自有机房高效搭建专业网站?  如何快速使用云服务器搭建个人网站?  Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载  ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】  Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】  如何在宝塔面板中创建新站点?  怎样使用JSON进行数据交换_它有什么限制  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  如何在Ubuntu系统下快速搭建WordPress个人网站?  香港服务器WordPress建站指南:SEO优化与高效部署策略  Laravel Session怎么存储_Laravel Session驱动配置详解  浅谈redis在项目中的应用  如何用好域名打造高点击率的自主建站?  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】  Claude怎样写约束型提示词_Claude约束提示词写法【教程】  HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】  创业网站制作流程,创业网站可靠吗?