在 range 迭代 slice 时,你怎么修改值的

提问者:帅平 问题分类:面试刷题
在 range 迭代 slice 时,你怎么修改值的
3 个回答
怕她脏还是爱她葬
怕她脏还是爱她葬
在 range 迭代中,得到的值其实是元素的一份值拷贝,更新拷贝并不会更改原来的元素,即是拷贝的地址并不是原有元素的地址。
func main() {
 data := []int{1, 2, 3}
 for _, v := range data {
  v *= 10  // data 中原有元素是不会被修改的
 }
 fmt.Println("data: ", data) // data:  [1 2 3]
}
如果要修改原有元素的值,应该使用索引直接访问。
func main() {
 data := []int{1, 2, 3}
 for i, v := range data {
  data[i] = v * 10 
 }
 fmt.Println("data: ", data) // data:  [10 20 30]
}
发布于:5个月前 (11-29) IP属地:四川省
温柔刀下鬼
温柔刀下鬼
如果你的集合保存的是指向值的指针,需稍作修改。依旧需要使用索引访问元素,不过可以使用 range 出来的元素直接更新原有值。
func main() {
 data := []*struct{ num int }{{1}, {2}, {3},}
 for _, v := range data {
  v.num *= 10 // 直接使用指针更新
 }
 fmt.Println(data[0], data[1], data[2]) // &{10} &{20} &{30}
}
发布于:5个月前 (11-29) IP属地:四川省
我来回答