range操作数组和切片的区别

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)的值。(深拷贝)

猜你喜欢

转载自blog.csdn.net/qq_43234632/article/details/105891942