Go 中 for 是唯一循环结构,应按场景选择写法:无条件循环用 for {},条件循环用 for cond {},传统遍历用 for init; cond; post {},核心是清晰与安全。
for 循环的三种写法到底怎么选
Golang 的 for 是唯一循环结构,没有 while 或 do-while,但通过省略初始化、条件、后置语句,能模拟出不同行为。关键不是“能不能”,而是“哪种写法更清晰、更不易出错”。
常见误用是强行套用 C 风格三段式,比如 for i := 0; i —— 这在切片长度为 0 时没问题,但若 slice 是 nil,len(slice) 仍安全;真正危险的是后续直接用 slice[i] 访问,可能 panic。
- 遍历索引+值:优先用
for i, v := range slice,编译器会做边界检查,且自动处理 nil 切片(不进入循环) - 纯计数循环(如重试 3 次):用
for i := 0; i ,简洁明确 - 条件驱动循环(如读 channel 直到关闭):用
for v, ok := ,避免重复写接收表达式
range 遍历时修改元素值为什么没生效
这是新手高频踩坑点:for _, v := range slice 中的 v 是元素副本,对 v 赋值不会影响原切片。Golang 不提供“引用遍历”语法糖,必须显式通过索引写回。
正确做法是保留索引:for i := range slice 或 for i, v := range slice,然后用 slice[i] = ... 修改。