golang的数组的append操作


今天学习了一下数组的操作,写了如下代码

	test8_3 := [] int {0,1,2,3,4,5,6,7,8,9}

	a := test8_3[2:]
	//b := test8_3[:6]
	//c := test8_3[2:6]
	fmt.Println("old A",a,len(a),cap(a),reflect.TypeOf(a))
	//old A [2 3 4 5 6 7 8 9] 8 8 []int

	fmt.Println("old T",test8_3,len(test8_3),cap(test8_3))
	//old T [0 1 2 3 4 5 6 7 8 9] 10 10
	
	a = append(a,10)
	a[2] = 100
	fmt.Println("new A",a,len(a),cap(a))
	//new A [2 3 100 5 6 7 8 9 10] 9 16
	fmt.Println("new T",test8_3,len(test8_3),cap(test8_3))
	//new T [0 1 2 3 4 5 6 7 8 9] 10 10

 

为何我修改了a这个切片的第二个元素的值,但是对原始的切片没有影响呢? 之前学的不这样啊,对数组的切片实际还是对原来数组的引用,如果修改切片后的数组,是对原数组是有影响的啊,但是这里为什么没有?

 

突然看到,我这里有一个a切片的append的操作,会不会append操作后,a切片就不是之前的a切片了,也就不是对原始数组的引用了?如何证明的,那么我们就打印一下切片的首个元素的内存地址把

	test8_3 := [] int {0,1,2,3,4,5,6,7,8,9}

	a := test8_3[2:]
	//b := test8_3[:6]
	//c := test8_3[2:6]
	fmt.Println("old A",a,len(a),cap(a),reflect.TypeOf(a),&a[0])
	//old A [2 3 4 5 6 7 8 9] 8 8 []int 0xc000068060

	fmt.Println("old T",test8_3,len(test8_3),cap(test8_3))
	//old T [0 1 2 3 4 5 6 7 8 9] 10 10

	a = append(a,10)
	a[2] = 100
	fmt.Println("new A",a,len(a),cap(a),&a[0])
	//new A [2 3 100 5 6 7 8 9 10] 9 16 0xc000096080
	fmt.Println("new T",test8_3,len(test8_3),cap(test8_3))
	//new T [0 1 2 3 4 5 6 7 8 9] 10 10

 

我们看到前后两次打印a变量的第一个元素的内存地址是不一样的,所以证明了我的怀疑

 

然后我把append这个操作注释掉,在确认下前后两次打印的内存地址是否一样

	test8_3 := [] int {0,1,2,3,4,5,6,7,8,9}

	a := test8_3[2:]
	//b := test8_3[:6]
	//c := test8_3[2:6]
	fmt.Println("old A",a,len(a),cap(a),reflect.TypeOf(a),&a[0])
	//old A [2 3 4 5 6 7 8 9] 8 8 []int 0xc00000c240

	fmt.Println("old T",test8_3,len(test8_3),cap(test8_3))
	//old T [0 1 2 3 4 5 6 7 8 9] 10 10

	//a = append(a,10)
	a[2] = 100
	fmt.Println("new A",a,len(a),cap(a),&a[0])
	//new A [2 3 100 5 6 7 8 9] 8 8 0xc00000c240
	fmt.Println("new T",test8_3,len(test8_3),cap(test8_3))
	//new T [0 1 2 3 100 5 6 7 8 9] 10 10

 

证明我们的猜测,这次前后两次的内存地址是一样的,同样,修改切片后的元素的值,对原始数组也产生了影响

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM