Go语言仅提供for一种循环语句,通过统一设计实现所有循环逻辑;计数循环采用标准三段式:for i := 0; i < n; i++ {}。

Go 语言中只有 for 一种循环语句,所有循环逻辑(包括 while、do-while、遍历)都靠它实现——不是语法糖少,而是设计上刻意统一。
怎么写计数循环:最常用但最容易写错作用域
标准三段式:for i := 0; i 。注意三点:
- 初始化语句(
i := 0)中声明的变量i作用域仅限该for块内,循环外访问会报undefined: i - 条件判断在每次迭代前执行;后置语句(
i++)在循环体执行完后才运行 - 别写成
for i := 0, i ——Go 要求用分号 <code>;分隔三部分,逗号是语法错误
怎么模拟 while 循环:省略初始化和后置,但不能省略分号
当循环次数不确定、只依赖状态变量时,用 for condition { ... }:
- 正确写法:
n := 1; for n —— 初始化放外面,<code>for后只留条件 - 错误写法:
for n 却没提前声明 <code>n→ 编译失败:undefined: n - 绝对不能写
for true { ... }—— Go 不允许布尔字面量作条件,必须用for { ... }
怎么安全遍历切片、map 和 channel:range 不是万能,副本陷阱很常见
for range 是最简洁的遍历方式,但行为因类型而异:
立即学习“go语言免费学习笔记(深入)”;
- 遍历切片时,
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 往往藏得深、复现难。










