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
- 避免索引: 不需要索引时用 _ 忽略
- 标签慎用: 嵌套循环尽量用函数替代
- 作用域清晰: 循环变量只在循环内有效