Go Tour 的 Flow Control 章节里,有一个叫“For continued”的小练习,代码短得可怜,但背后藏着不少值得琢磨的细节。咱们先看看这段代码到底在干什么,以及它为什么能输出 1024。

直接上代码:
package main
import "fmt"
func main() {
sum := 1
for ; sum < 1000; {
sum += sum
}
fmt.Println(sum)
}
这个 for 循环省略了初始化语句和后置语句,只保留了条件判断 sum < 1000,看起来很像其他语言里的 while 循环。Go 对 C 风格的 for 做了精简,三个部分都可以省略,这是其中之一。
循环体里只有一句 sum += sum。换句话说,每次循环都把 sum 翻倍。等价于 sum = sum * 2。所以 sum 不是线性增长,而是指数级翻倍:
- 初始值:sum = 1
- 第1次循环:sum = 1 + 1 = 2
- 第2次:sum = 2 + 2 = 4
- 第3次:sum = 4 + 4 = 8
- 第4次:sum = 8 + 8 = 16
- ……
- 第9次后:sum = 512,此时 512 < 1000 成立,继续循环
- 第10次:sum = 512 + 512 = 1024,此时 1024 < 1000 不成立,循环终止
- 最终输出:1024
需要特别注意的是,循环条件是在每次迭代开始前检查的。所以当 sum 变成 1024 后,不会再进入循环体,而是直接退出并打印结果。这也解释了为什么最终输出是 1024 而不是 2048。
整个过程中没有用到 i++ 或传统计数器,却清晰地展示了 Go 对 C 风格 for 的精简支持。三个部分均可省略,比如 for { } 就是无限循环。这种写法让开发者更专注于逻辑本身,而不是循环的机械结构。
总结一下核心点:
sum += sum的本质是 2 的幂增长,每次翻倍;- 循环终止于第一个不满足
sum < 1000的值,即 2^10 = 1024; - 理解这个例子,有助于掌握 Go 中无初始化、无后置语句的 for 用法,也为后续学习 range、break/continue 以及循环嵌套打下基础。