首先先创建一个切片,长度为5,容量为6,默认值的话是 0 0 0 0 0
根据切片的下标0第一位修改成10,下标2第三位修改成30
此时的切片是10 0 30 0 0
如果使用append在切片中追加2022,2021元素
输出结果如下
我们在创建slice切片的时候指定了切片的容量为6,在使用了append追加了2个元素(原本是5个,追加后变成7个),对slice切片进行了扩容。
在Go语言的官方文档中能看到append里说道。"若它有足够的容量,其目标就会重新切片以容纳新的元素。否则,就会分配一个新的数组"
回到例子,内存图如下,当他超过了slice切片本身一开始的容量,则会在内存中开辟一个新的数组,将值拷贝过去并添加新的元素(因为数组长度是不可改变的),所以此时slice切片会指向新的数组的地址值(如果本身所添加的元素没有超过slice切片本身,则还是指向原来数组的地址值,因为没扩容没产生新的数组)
由于进行了扩容在内存中开辟了新的数组,则slice切片本身内部结构也会随之改变。(包括地址值,长度,容量)
以上就是在学习Go语言中的slice切片,遇到append的问题,对此做个记录