第十八回:Go 语言范围(Range)

遍历整个华府(Range 迭代详解)
石榴姐
石榴姐: 每天早上都要点名,一个个查过去,累死老娘了!有没有快一点的办法?
唐伯虎
唐伯虎:range 啊!它能自动帮你把数组、切片、Map 甚至字符串里的东西一个个拿出来。

1. 📋 数组和切片 (Array/Slice)

range 会返回两个值:索引 (Index)值 (Value)

nums := []int{100, 200, 300}

for i, v := range nums {
    fmt.Printf("索引:%d, 值:%d\n", i, v)
}

// 只要值?用 _ 丢掉索引
for _, v := range nums {
    fmt.Println(v)
}

⚠️ 警告: 这里的 v 是值的副本!修改 v 不会影响原数组。

2. 🗺️ 地图寻宝 (Map)

遍历 Map 时,返回的是 Key (键)Value (值)

华夫人
华夫人: 记住,Map 的遍历顺序是随机的!不要以为它会按顺序排好。
m := map[string]string{"name": "秋香", "age": "18"}
for k, v := range m {
    fmt.Println(k, v)
}

3. 🔤 逐字逐句 (String)

遍历字符串时,range 会智能地按 Rune (字符) 遍历,而不是按字节。这对于中文非常友好!

str := "Go语言"
// i 是字节位置,r 是字符(rune)
for i, r := range str {
    fmt.Printf("%d: %c\n", i, r)
}
// 输出:
// 0: G
// 1: o
// 2: 语 (注意索引直接跳到了2,因为"语"占了3个字节)
// 5: 言

🎯 练功房(找秋香)

在名单里找到 "秋香" 并打印她的位置。

package main
import "fmt"

func main() {
    names := []string{"春香", "夏香", "秋香", "冬香"}
    
    for i, name := range names {
        if name == "秋香" {
            fmt.Println("找到秋香了!她在第", ______, "个位置")
        }
    }
}

任务: 填空处应该写什么?

答案: i

解析: i 是当前遍历到的索引。