← if 条件 | switch 分支 →

for 循环 - Go 流程控制

for 是 Go 唯一的循环语句,功能强大且灵活。掌握 for 循环的各种用法是编写高效 Go 代码的基础。

📌 核心概念

🔄

三种形式

条件/计数/无限

for
📚

range

遍历集合

range
⏭️

控制语句

break/continue

跳转控制
🏷️

标签

跳出嵌套循环

label

基础用法

📝 for 循环三种形式

package main

import "fmt"

func main() {
    // 形式 1: 完整形式 (初始化; 条件; 后置)
    for i := 0; i < 5; i++ {
        fmt.Printf("%d ", i)
    }
    // 输出:0 1 2 3 4
    
    // 形式 2: 只有条件 (类似 while)
    j := 0
    for j < 5 {
        fmt.Printf("%d ", j)
        j++
    }
    // 输出:0 1 2 3 4
    
    // 形式 3: 无限循环
    count := 0
    for {
        if count >= 5 {
            break
        }
        fmt.Printf("%d ", count)
        count++
    }
    // 输出:0 1 2 3 4
}

💡 for 循环要点

  • 唯一循环: Go 只有 for 一种循环语句
  • 括号可选: 条件不需要括号
  • 作用域: 初始化语句中的变量只在循环内有效
  • 分号必需: 完整形式中分号不能省略

range 遍历

📝 range 各种用法

package main

import "fmt"

func main() {
    // 遍历数组
    arr := [3]int{1, 2, 3}
    for i, v := range arr {
        fmt.Printf("arr[%d]=%d\n", i, v)
    }
    
    // 遍历切片
    slice := []string{"a", "b", "c"}
    for i, v := range slice {
        fmt.Printf("slice[%d]=%s\n", i, v)
    }
    
    // 遍历 Map (无序)
    m := map[string]int{"a": 1, "b": 2}
    for k, v := range m {
        fmt.Printf("m[%s]=%d\n", k, v)
    }
    
    // 只获取索引
    for i := range slice {
        fmt.Printf("index: %d\n", i)
    }
    
    // 只获取值 (忽略索引)
    for _, v := range slice {
        fmt.Printf("value: %s\n", v)
    }
    
    // 遍历字符串 (按 rune)
    str := "你好"
    for i, r := range str {
        fmt.Printf("pos %d: %c\n", i, r)
    }
}

break 和 continue

📝 循环控制

package main

import "fmt"

func main() {
    // continue: 跳过本次迭代
    for i := 0; i < 10; i++ {
        if i%2 == 0 {
            continue // 跳过偶数
        }
        fmt.Printf("%d ", i)
    }
    // 输出:1 3 5 7 9
    
    // break: 提前退出循环
    for i := 0; i < 10; i++ {
        if i == 5 {
            break // 找到 5 就退出
        }
        fmt.Printf("%d ", i)
    }
    // 输出:0 1 2 3 4
    
    // 标签:跳出嵌套循环
    OuterLoop:
    for i := 0; i < 3; i++ {
        for j := 0; j < 3; j++ {
            if i == 1 && j == 1 {
                break OuterLoop // 跳出外层循环
            }
            fmt.Printf("i=%d, j=%d\n", i, j)
        }
    }
}

实用模式

1. 索引遍历

📝 常见遍历模式

// 正向遍历
for i := 0; i < len(slice); i++ {
    fmt.Println(slice[i])
}

// 反向遍历
for i := len(slice) - 1; i >= 0; i-- {
    fmt.Println(slice[i])
}

// 步长遍历
for i := 0; i < len(slice); i += 2 {
    fmt.Println(slice[i])
}

// range 遍历 (推荐)
for i, v := range slice {
    fmt.Printf("[%d] = %v\n", i, v)
}

// 只遍历索引
for i := range slice {
    fmt.Println(slice[i])
}

2. 条件循环

📝 while 风格循环

// 读取直到条件不满足
var sum int
for sum < 100 {
    sum += getNextValue()
}

// 读取用户输入
for {
    input := readInput()
    if input == "quit" {
        break
    }
    process(input)
}

// 带超时的重试
var err error
for attempt := 0; attempt < 3; attempt++ {
    err = doSomething()
    if err == nil {
        break
    }
    time.Sleep(time.Second)
}

最佳实践

✅ for 循环使用建议

  • 优先 range: 遍历集合优先使用 range
  • 避免索引: 不需要索引时用 _ 忽略
  • 标签慎用: 嵌套循环尽量用函数替代
  • 作用域清晰: 循环变量只在循环内有效