14.8 在 range 迭代 slice 时,你怎么修改值的 - Go语言中文社区

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


在 range 迭代中,得到的值其实是元素的一份值拷贝,更新拷贝并不会更改原来的元素,即是拷贝的地址并不是原有元素的地址。

  1. func main() {
  2. data := []int{1, 2, 3}
  3. for _, v := range data {
  4. v *= 10 // data 中原有元素是不会被修改的
  5. }
  6. fmt.Println("data: ", data) // data: [1 2 3]
  7. }

如果要修改原有元素的值,应该使用索引直接访问。

  1. func main() {
  2. data := []int{1, 2, 3}
  3. for i, v := range data {
  4. data[i] = v * 10
  5. }
  6. fmt.Println("data: ", data) // data: [10 20 30]
  7. }

如果你的集合保存的是指向值的指针,需稍作修改。依旧需要使用索引访问元素,不过可以使用 range 出来的元素直接更新原有值。

  1. func main() {
  2. data := []*struct{ num int }{{1}, {2}, {3},}
  3. for _, v := range data {
  4. v.num *= 10 // 直接使用指针更新
  5. }
  6. fmt.Println(data[0], data[1], data[2]) // &{10} &{20} &{30}
  7. }
版权声明:本教程内容除了本站原创内容外,还有来源自C语言编程网,博客园,CSDN等技术站点,感谢相关博主原创文章,转载请附上原文出处链接和本声明。
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 阅读 ( 612 )
  • 分类:Go

0 条评论

官方社群

GO教程

猜你喜欢