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