1.首先需要理解深、浅拷贝:https://www.jianshu.com/p/372218aff8ef
2.在使用range的时候总是不能很好把握value的值,用一个示例理解操作引用类型和值类型得区别。(同样的代码只有数组和切片的区别)
示例一:
func main() {
a := []int{
1, 2, 3}
for i, v := range a {
fmt.Println("&v", &v)
if i == 0 {
a[1], a[2] = 200, 300
fmt.Println("&a", &a[1])
}
fmt.Println("v", v)
}
fmt.Println("a", a)
}
示例一结果:
&v 0xc0000a0068
&a 0xc00009e128
v 1
&v 0xc0000a0068
v 200
&v 0xc0000a0068
v 300
a [1 200 300]
示例二:(只是修改了a的类型)
func main() {
a := [3]int{
1, 2, 3}
for i, v := range a {
fmt.Println("&v", &v)
if i == 0 {
a[1], a[2] = 200, 300
fmt.Println("&a", &a[1])
}
fmt.Println("v", v)
}
fmt.Println("a", a)
}
示例二结果:
&v 0xc0000120a0
&a 0xc00000a408
v 1
&v 0xc0000120a0
v 2
&v 0xc0000120a0
v 3
a [1 200 300]
仔细比较一下两次打印结果可以得出结论。
结论:当使用range操作引用类型的时候(slice、map),遍历对象(示例中的a)的改变都会影响value(示例中的v)的值。(浅拷贝)
反之,当使用range操作值类型的时候(array、int、string、struct、float,bool),遍历对象的改变(示例中的a)的改变不会影响value(示例中的v)的值。(深拷贝)