13_range遍历与索引
遍历数组、切片、映射和字符串,理解得到的是索引、值还是字节位置。
Go 基础专题 13:range 遍历与索引
学习目标:遍历数组、切片、映射和字符串,理解得到的是索引、值还是字节位置。
核心知识
for index, value := range items 遍历序列,index 从 0 开始。只需索引可写 for i := range items;只需值可写 for _, value := range items。range 取出的值是元素的副本,修改 value 不会修改切片元素;要修改时用 items[index] = ...。
package main
import "fmt"
func main() {
names := []string{"Ada", "Lin"}
for index, name := range names {
fmt.Println(index, name)
}
for index := range names {
names[index] += "!"
}
fmt.Println(names)
}
遍历字符串时,range 解码 UTF-8,索引是字节偏移,值是 rune,不能假设中文字符的索引连续加 1。遍历 map 时迭代顺序不保证稳定,展示或测试需要排序键。Go 1.22+ 的 range 循环变量按每次迭代分别创建,旧版代码中闭包捕获问题需结合目标版本判断。
不应在遍历切片时随意追加或删除原切片,循环迭代的范围与底层变化会让行为难理解。可先构造新切片。
逐步理解
对 []string{"Ada", "Lin"},range 每轮给一个索引和值副本;直接改 name 只改变副本。要改原元素,用 names[index]。字符串的 range 则给字节起点和码点,处理中文时字节偏移会跳跃。map 的遍历顺序不能作为测试预期,测试需要先排序或比较集合。
动手练习
练习:把所有负数改成 0。答案要点:for i := range values { if values[i] < 0 { values[i] = 0 } }。