Go语言range遍历修改slice的原值

寅恪光潜
领域专家: 人工智能技术领域
2022-11-16 11:56:01
加精
package main

import "fmt"

func main() {
	s := []int{1, 2, 3, 4}
	for _, v := range s {
		v *= 2
	}
	fmt.Println(s) //[1 2 3 4]
}

这样没有修改slice切片s的值,为什么呢?切片是引用类型啊,恩,这里的range遍历实际得到的也是一份拷贝,所以修改拷贝,不会修改到原来的值。
那如何修改呢?使用索引来更新。

package main

import "fmt"

func main() {
	s := []int{1, 2, 3, 4}
	for k, v := range s {
		s[k] = v * 2
	}
	fmt.Println(s) //[2 4 6 8]
}

如果集合保存的是指向值的指针,那就可以直接更新了:

package main

import "fmt"

func main() {
	s := []*struct{ i int }{{1}, {2}, {3}}
	for _, v := range s {
		fmt.Print(v) //&{1}&{2}&{3}
		v.i *= 2
	}
	fmt.Println(*s[0], *s[1], *s[2]) //{2} {4} {6}
}

因为range遍历的value是指针,我们也打印v看到的是取地址,就是内存地址,然后指向成员变量直接更新即可,s的值也更新了。

欢迎加入我们,一起学习一起进步,成为go技术达人

...全文
来 CSDN 抢优惠
拼手气红包 5.00元
273 1 打赏 收藏 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
CSDN-Ada助手 2023-01-13
  • 打赏
  • 举报
回复
您可以前往 CSDN问答-编程语言 发布问题, 以便更快地解决您的疑问

199

社区成员

发帖
与我相关
我的任务
社区描述
从零开始的小白到进阶成技术达人。 一起学习,一起进步。
golanggo1.19 个人社区 贵州省·贵阳市
社区管理员
  • 寅恪光潜
  • 网络豆
  • Somnus_小凯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

Go语言集各语言优势之大成,从基础到进阶

一起学习,一起进步,成为技术达人!

试试用AI创作助手写篇文章吧