Go语言仅提供for一种循环语句,通过统一设计实现所有循环逻辑;计数循环采用标准三段式:for i := 0; iGo 语言中只有
for一种循环语句,所有循环逻辑(包括 while、do-while、遍历)都靠它实现——不是语法糖少,而是设计上刻意统一。怎么写计数循环:最常用但最容易写错作用域
标准三段式:
for i := 0; i 。注意三点:
- 初始化语句(
i := 0)中声明的变量i作用域仅限该for块内,循环外访问会报undefined: i- 条件判断在每次迭代前执行;后置语句(
i++)在循环体执行完后才运行- 别写成
for i := 0, i ——Go 要求用分号;分隔三部分,逗号是语法错误怎么模拟 while 循环:省略初始化和后置,但不能省略分号
当循环次数不确定、只依赖状态变量时,用
for condition { ... }:
- 正确写法:
n := 1;for n —— 初始化放外面,
for后只留条件- 错误写法:
for n 却没提前声明n→ 编译失败:undefined: n- 绝对不能写
for true { ... }—— Go 不允许布尔字面量作条件,必须用for { ... }怎么安全遍历切片、map 和 channel:range 不是万能,副本陷阱很常见
for range是最简洁的遍历方式,但行为因类型而异:
- 遍历切片时,
v是元素副本:for _, v := range nums { v *= 2 }不会改变原切片;要修改得用索引:nums[i] = v * 2- 遍历
map时顺序不保证,且k、v都是副本;想改值必须m[k] = newV- 遍历
channel时,for v := range ch会在ch关闭后自动退出;若未关闭,会永久阻塞怎么跳出多层嵌套:标签不是 goto,但 break label 很实用
嵌套循环中,
break默认只跳出最内层。需要跨层控制时:
- 给外层
for加标签:outer: for i := 0; i- 内层用
break outer直接终止外层循环,不是跳转到某行,而是干净退出整个结构- 标签名后必须跟冒号,且不能换行;
continue outer也能跳到外层下一轮真正难的不是写对语法,而是理解每种写法背后的作用域规则、求值时机和数据所有权——比如
range返回的是副本还是引用,for { }里忘了break就是死循环,这些细节一旦忽略,bug 往往藏得深、复现难。