目录

go 遍历切片时如何同时修改元素

目录

背景

遍历切片的时候,我想要同时修改元素的值,发现修改无效

package main

import "fmt"

func main() {
    nums := []int{1, 2, 3}

    for _, num := range nums {
        num *= 2  // 修改的是副本,不影响原切片
    }

    fmt.Println(nums) // 输出: [1 2 3] (未改变)
}

原因​​:for range 循环中,num 是切片元素的副本,修改它不会影响原切片。

切片本身是引用类型但元素是值类型;虽然切片本身是引用类型(底层数组的引用),但当元素是基本类型(如 int, string 等)时,遍历获取的是值的拷贝。

解决:

使用索引下标修改

for i := range nums {
    nums[i] *= 2  // 直接通过索引修改
}
fmt.Println(nums) // 输出: [2 4 6]

使用指针切片,不推荐也没必要

nums := []*int{new(int), new(int), new(int)}
for i := range nums {
    *nums[i] = i + 1  // 解引用修改
}

tips:

切片元素是指针类型、遍历 map 都是可以直接修改元素