Go语言仅提供for一种循环语句,包含三段式、条件式和无限循环式三种形式;三段式for语法为“for 初始化; 条件表达式; 后置操作 { ... }”,初始化执行一次,条件在每次循环前判断,后置操作在循环体后执行。

Go语言中只有for一种循环语句,没有while或do-while,但通过灵活写法可以实现所有循环逻辑。核心在于理解它的三种形式:传统三段式、条件式、无限循环式。
传统for循环(带初始化、条件、后置操作)
这是最接近其他语言for的写法,常用于已知迭代次数的场景,比如遍历数组索引或计数。
语法结构:for 初始化; 条件表达式; 后置操作 { ... }
说明:
- 初始化只执行一次,通常声明并赋值循环变量;
- 每次循环开始前判断条件,为false则退出;
- 后置操作在每次循环体执行完后运行,常用于递增/递减。
示例:
立即学习“go语言免费学习笔记(深入)”;
for i := 0; i < 5; i++ {
fmt.Println(i)
}
注意:
- 变量i作用域仅限于该for块内;
- 不支持逗号分隔多个初始化或后置语句(如i,j := 0,0需提前声明);
- 条件部分不能加括号,写成for (i 会报错。
条件型for循环(类似while)
省略初始化和后置操作,只保留条件表达式,适合依赖外部状态或复杂退出条件的场景。
语法:for 条件 { ... }
常见用法:
- 模拟while (condition)逻辑;
- 配合break或return提前退出;
- 处理IO读取、状态轮询等不确定次数的操作。
示例:
立即学习“go语言免费学习笔记(深入)”;
sum := 0
n := 1
for sum < 100 {
sum += n
n++
}
无限循环(for {})与手动控制
省略全部三个部分,构成死循环,必须靠break、return或os.Exit()等显式跳出,否则程序卡住。
适用场景:
- 服务器主循环(如HTTP服务监听);
- 游戏主帧循环;
- 需要持续监听信号或通道的后台协程。
示例:
立即学习“go语言免费学习笔记(深入)”;
for {
select {
case msg := <-ch:
handle(msg)
case <-done:
return
}
}
提示:
- 别忘了在循环体内提供退出路径,否则编译虽通过,运行会阻塞;
- 配合select使用时,default分支可避免阻塞,实现非阻塞轮询。
range关键字:专用于遍历集合
for ... range是Go特有语法,用于安全、简洁地遍历数组、切片、字符串、map、channel。它自动处理边界和类型,比手动索引更推荐。
基本形式:for key, value := range collection { ... }
要点:
- map遍历时key/value顺序不保证;
- 切片/数组遍历时key是索引,value是元素副本(修改value不影响原数据);
- 如果不需要某个值,用下划线_忽略,避免编译错误(如for _, v := range s);
- 字符串按rune遍历(支持Unicode),不是字节。
示例:
立即学习“go语言免费学习笔记(深入)”;
nums := []int{10, 20, 30}
for i, v := range nums {
fmt.Printf("index %d: %d\n", i, v)
}
基本上就这些。Go的for看似简单,但把“少即是多”体现得很彻底——掌握这几种写法,就能覆盖全部循环需求,还不容易出错。










