← Backend / Go / 基础专题

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 } }。