slice的append操作对原数组的影响
学习知识点:
1.cap不越界,slice直接引用原数组,并改变数组内元素的值;
2.cap越界,分配新的数组,cap是原slice cap的两倍。
实验:
知识点一验证:
输入:
arr := [...]int{0,1,2,3,4}s1 := arr[3:4] // [3]s2 := append(s1,14)fmt.Printf(\"arr:%v,len(arr)为%d,cap(arr为%d\\n\",arr,len(arr),cap(arr))fmt.Printf(\"s1:%v,len(s1)为%d,cap(s1)为%d\\n\",s1,len(s1),cap(s1))fmt.Printf(\"s2:%v,len(s2)为%d,cap(s2)为%d\\n\",s2,len(s2),cap(s2))
输出:
arr:[0 1 2 3 14],len(arr)为5,cap(arr)为5s1:[3],len(s1)为1,cap(s1)为2s2:[3 14],len(s2)为2,cap(s2)为2
实验结果:cap不越界(slice的cap值为切片起始位置到数组最后一个元素的数量),slice直接引用原数组,进行append操作,原数组arr[4]由4变为14。
知识点二验证:
输入:
arr := [...]int{0,1,2,3,4}s1 := arr[3:4] // [3]s2 := append(s1,14,15)fmt.Printf(\"arr:%v,len(arr)为%d,cap(arr为%d\\n\",arr,len(arr),cap(arr))fmt.Printf(\"s1:%v,len(s1)为%d,cap(s1)为%d\\n\",s1,len(s1),cap(s1))fmt.Printf(\"s2:%v,len(s2)为%d,cap(s2)为%d\\n\",s2,len(s2),cap(s2))
输出:
arr:[0 1 2 3 4],len(arr)为5,cap(arr)为5s1:[3],len(s1)为1,cap(s1)为2s2:[3 14 15],len(s2)为3,cap(s2)为4
实验结果:append元素导致len(slice)超过cap值,会分配新的数组,cap由原来的2扩展到4,append操作原数组不影响。
但是却发现
在cap不越界的条件下,对原数组遍历时发现,数组内元素没有变化。
输入
for ele := range arr {fmt.Println(ele)}
输出
01234
不太理解,求解释。。。