今天学习了一下数组的操作,写了如下代码
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
证明我们的猜测,这次前后两次的内存地址是一样的,同样,修改切片后的元素的值,对原始数组也产生了影响