AI智能
改变未来

go语言中slice的append操作对原数组的影响


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

不太理解,求解释。。。

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » go语言中slice的append操作对原数组的影响