如何在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 slice或for 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 索引;r 是 rune 类型,不是 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格式兼容性及导出步骤【指南】
创业网站制作流程,创业网站可靠吗?


