Skip to content

Go 循环

循环是基本的控制结构,允许您重复执行一段代码块。Go 只有一种循环结构,即 for 循环,但它功能多样,足以涵盖其他语言中各种循环场景(如 while 或 do-while 循环)。

Go 的 for 循环可以通过几种方式使用:

这种形式包含一个初始化语句(initialization statement)、一个条件表达式(condition expression)和一个后置语句(post statement)。

package main
import "fmt"
func main() {
for i := 0; i < 5; i++ {
fmt.Println("Iteration:", i) // 输出 0, 1, 2, 3, 4
}
}

通过省略初始化语句和后置语句,for 循环的行为类似于其他语言中的 while 循环。

package main
import "fmt"
func main() {
n := 1
for n <= 5 {
fmt.Println("n is:", n)
n *= 2 // n 变为 1, 2, 4, 8 (当 n=8 时循环退出)
}
}

如果条件也被省略,则会创建一个无限循环。这种循环必须通过循环体内的 break 或 return 语句,或通过其他方式(例如,panic)退出。

package main
import (
"fmt"
"time"
)
func main() {
count := 0
for {
fmt.Println("Infinite loop iteration...")
time.Sleep(500 * time.Millisecond)
count++
if count >= 3 {
fmt.Println("退出无限循环。")
break
}
}
// 注意: 在命令行程序中,通常可以通过按下 Ctrl + C 来终止无限循环。
}

这种形式遍历切片(slices)、数组(arrays)、字符串(strings)、映射(maps)和通道(channels)等各种数据结构中的元素。它在“Go - Range”章节中详细介绍。

Go 提供了用于改变循环正常执行流程的语句:

控制语句描述
break终止最内层的 for、switch 或 select 语句。执行将在被终止的循环/switch/select 语句之后立即恢复。
continue跳过最内层 for 循环当前迭代的剩余部分。执行将进入 post 语句(如果有),然后是下一次迭代的条件判断。
goto将控制权转移到同一函数内带有标签的语句。通常不建议使用 goto,因为它会使代码复杂且难以理解。在惯用的 Go 代码中很少需要它。

示例: break 和 continue

package main
import "fmt"
func main() {
// 使用 continue 打印奇数
fmt.Println("Odd numbers up to 10 (using continue):")
for i := 1; i <= 10; i++ {
if i%2 == 0 { // 如果 i 是偶数
continue // 跳过本次迭代的剩余部分
}
fmt.Printf("%d ", i)
}
fmt.Println()
// 使用 break 查找第一个能被 3 和 5 整除的数字
fmt.Println("\nFinding first number divisible by 3 and 5 (using break):")
for i := 1; i <= 100; i++ {
if i%3 == 0 && i%5 == 0 {
fmt.Printf("Found: %d\n", i)
break // 一旦找到就退出循环
}
}
}

您可以在其他 for 循环内使用 for 循环。break 和 continue 语句作用于最内层循环,除非使用了标签(label)。

package main
import "fmt"
func main() {
OuterLoop: // 外部循环的标签
for i := 1; i <= 3; i++ {
for j := 1; j <= 3; j++ {
fmt.Printf("i=%d, j=%d\n", i, j)
if i == 2 && j == 2 {
fmt.Println("Breaking out of OuterLoop from inner loop")
break OuterLoop // 带有标签的 break 语句
}
}
}
}

for 循环是 Go 中一个强大且灵活的构造,可以适应所有常见的循环模式。