跳转到主要内容
模块 2 · 第 2 课(共 5)课程中的7/50~10 min
模块课程(2/5)

for:唯一的循环

Go 有一个单循环构造:for。没有 while,没有 do-while,没有 foreach(在下一课中出现) range)。通过三种形式,单个关键字涵盖了所有情况。

for 的三种形式

经典的三分句形式

与 C/Java 相同:

Go
for i := 0; i < 5; i++ {
    fmt.Println(i)
}

i 的范围仅限于 for。这三个子句是可选的(您可以 省略其中任何一个),但如果省略中间一个,则 ; 仍然存在。

“while”形式:仅条件

在 Go 中, while 只是一个 for 和一个 bool 表达式:

Go
i := 0
for i < 5 {
    fmt.Println(i)
    i++
}

无限形式

如果没有子句,循环永远不会终止(除非 break/return):

Go
for {
    if exitCondition() {
        break
    }
    doWork()
}

它是事件处理循环、服务器、重试策略的模式。

break、continue 和标签

break 退出最内层循环, continue 跳到下一个迭代:

Go
for i := 0; i < 10; i++ {
    if i%2 == 0 {
        continue       // salta i pari
    }
    if i > 7 {
        break          // ferma il ciclo
    }
    fmt.Println(i)     // 1 3 5 7
}

要退出嵌套循环,有标签(罕见但有用):

Go
Esterno:
for i := 0; i < 3; i++ {
    for j := 0; j < 3; j++ {
        if i*j == 4 {
            break Esterno   // esce da entrambi
        }
    }
}

没有像 C 中那样的 , 运算符

在 Go 中你不能写 for i, j := 0, 10; i < j; i, j = i+1, j-1: post 表达式不接受多重赋值。使用 Go 的 多重赋值语法:

Go
for i, j := 0, 10; i < j; i, j = i+1, j-1 {
    fmt.Println(i, j)
}

相反,这有效,因为 i, j = i+1, j-1 是一个单一的 多重分配。

尝试一下

锻炼#go.m2.l2.e1
尝试:0加载中...

使用经典的三分句 for 打印从 0 到 4(含)的数字。

正在加载编辑器...
显示提示

`对于初始化;条件; post { ... }` — 这里 init 是 `i := 0`。

3 次尝试后可用的解决方案

锻炼#go.m2.l2.e2
尝试:0加载中...

使用 for 的“while”形式将 1 到 10 之间的所有数字相加。

正在加载编辑器...
显示提示

“while”形式:“for &lt;条件&gt; { ... }”。

3 次尝试后可用的解决方案

Quiz#go.m2.l2.e3
准备好

哪种形式代表 Go 中的无限循环?

Go
// (a) for i := 0; i < 10; i++ { ... }
// (b) for cond { ... }
// (c) for { ... }
答案选项

回顾

  • 单个关键字 for 具有三种形式:classic、while、infinite。
  • break / continue 可选地带有嵌套循环的标签。
  • 在 for 之前标记 Name:,谨慎使用。
  • 没有 , 作为运算符:使用多重赋值 i, j = ..., ...。