0

0

Go语言中的for循环多种用法 Golang循环控制与range关键字

P粉602998670

P粉602998670

发布时间:2026-03-13 16:22:11

|

395人浏览过

|

来源于php中文网

原创

go语言中的for循环多种用法 golang循环控制与range关键字

for 循环不写条件就是死循环?

是的,for { ... } 就是 Go 里唯一的「无限循环」写法,没有 whiledo-while。它不是语法糖,而是语言设计上的刻意简化——Go 把所有循环都统一成 for 的三种变体。

常见错误是想模仿其他语言写 for (i = 0; i 却漏掉某个分号,比如写成 <code>for i = 0; i (少了个分号),结果编译报错:<code>missing condition in for loop

  • for init; cond; post:完整三段式,initpost 可以是任意语句(包括函数调用、赋值、甚至空语句)
  • for cond:只留条件,等价于 while,但注意:Go 不允许省略分号只写条件——必须写成 for ; cond; 或更常见的 for cond(Go 会自动识别)
  • for { ... }:无条件,靠 breakreturn 退出;别在 goroutine 里忘了退出逻辑,否则 goroutine 泄露

range 遍历切片时,为什么 i 值总是 0?

因为 range 每次迭代都会复用同一个索引变量。如果你在循环内启动 goroutine 并直接引用 i,所有 goroutine 最终看到的都是最后一次迭代后的 i 值。

典型场景:并发处理切片元素,却意外全打在最后一个索引上。

立即学习go语言免费学习笔记(深入)”;

PPT.AI
PPT.AI

AI PPT制作工具

下载
  • 错误写法:for i := range items { go func() { fmt.Println(i) }() } → 全输出 len(items)-1
  • 正确做法之一:传参捕获当前值 —— for i := range items { go func(idx int) { fmt.Println(idx) }(i) }
  • 另一种:在循环体内声明新变量 —— for i := range items { i := i; go func() { fmt.Println(i) }() }
  • 注意:range 对 map 遍历时顺序不保证,且每次迭代的 key/value 也是复用变量,同样适用上述陷阱

for + range 遍历字符串,拿到的是 rune 还是 byte?

rune(即 Unicode 码点)。Go 字符串底层是 UTF-8 字节序列,但 range 会自动解码为 rune,按字符而非字节遍历。

这和直接用下标访问 str[i] 完全不同:后者拿的是字节,中文可能只拿到半个 UTF-8 编码,导致乱码或 panic。

  • 需要字节遍历?用传统 for:for i := 0; i
  • 需要字符遍历?用 rangefor i, r := range s { ... },其中 i 是起始字节位置,rrune
  • 性能影响:对纯 ASCII 字符串,range 解码开销可忽略;但对超长非 ASCII 文本(如大量 emoji),比字节遍历稍慢
  • 别把 range 当作「获取字符长度」手段:len(s) 返回字节数,utf8.RuneCountInString(s) 才是字符数

break 和 continue 能跳出多层 for 吗?

不能,默认只作用于最近一层。Go 没有带标签的 break label 语法,但可以用带标签的 break 实现类似效果——只是标签只能放在 forswitchselect 语句前。

容易踩的坑是以为 break 能直接跳出嵌套的多个 for,结果只退出了内层,外层继续跑。

  • 写法:outer: for i := range a { for j := range b { if cond { break outer } } }
  • 标签名不加冒号引用:break outer,不是 break outer:
  • continue 也支持标签,但仅限跳到对应循环开头,不能跳到任意位置
  • 函数内多层循环又不想用标签?考虑提前 return,更清晰也更符合 Go 习惯
事情说清了就结束。最常被忽略的其实是 range 对 map 的遍历顺序不可预测,以及 for 的三段式中 initpost 部分能执行任意语句——有人在里面写 deferrecover,结果行为完全不符合直觉。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

211

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

247

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

356

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

214

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

409

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

490

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

201

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

1479

2025.06.17

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

25

2026.03.13

热门下载

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

精品课程

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

共32课时 | 6.2万人学习

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

共10课时 | 0.9万人学习

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

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