首先,我们创建一个数组

image-20220120221720455

1号下标

image-20220120221854638

然后我们再声明一个s2变量,也是把数组s分片,此时就是如下图所示。

image-20220120222103988

如果此时我们修改s的值,如果在s1和s2的范围中,s1和s2的值也会改变,因为s1和s2都指向了这个数组。

s2 = append(s2, 999)

扩容机制:

比如我们有一个容量为2的切片,此时再添加3个元素,我们的容量至少要扩到5,5就是我们的预估容量。

那么我们此时就要判断,如果原来的容量翻倍还是小于这个预估容量,那么我们直接让容量等于预估容量。

否则,看原来切片的容量如果小于1024,那么直接翻倍,如果大于等于1024,每次扩1/4,直到新容量超过所需容量。

image-20220209223741289

第三步就是申请内存,在很多语言中,内存分配不是直接和操作系统交互的,而是和语言自身的内存管理模块交互,而自身的内存管理模块会提前先向操作系统申请一批内存,分成常用的规格管理起来。

当我们申请内存的时候,它会给我们分配足够大且最接近的规格,比如下面的24字节,就会被分配32个字节。

5 * 8 = 40byte48 / 8 = 6

image-20220210081435419

此时会创建一个新数组,这个新数组会首先把原数组的内容拿过来,然后在基础上添加元素,再让这个切片指向这个数组。

此时再修改s的内容,不会影响到s2。

image-20220120224510798