目录

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 都是可以直接修改元素

版权声明

未经授权,禁止转载本文章。
如需转载请保留原文链接并注明出处。即视为默认获得授权。
未保留原文链接未注明出处或删除链接将视为侵权,必追究法律责任!

本文原文链接: https://fiveyoboy.com/articles/go-range-slice/

备用原文链接: https://blog.fiveyoboy.com/articles/go-range-slice/