199
社区成员
发帖
与我相关
我的任务
分享
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技术达人