go slice底层实现原理

Go 的 slice 类型是对数组的一个抽象。在底层,它实际上是一个结构体,定义如下:

type slice struct {
    array unsafe.Pointer
    len   int
    cap   int
}

slice 包含了三个字段:一个指针指向底层数组的第一个元素,一个长度 len 表示 slice 包含的元素个数,以及一个容量 cap 表示 slice 指向的底层数组的总容量。

slice 与数组之间的主要区别在于,slice 可以动态地增长和缩小,而数组的长度在声明时就确定了。

例如,下面的代码创建了一个含有 10 个元素的数组,并使用 make 函数创建了一个指向该数组的 slice:

arr := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
s := make([]int, 3, 10)

这段代码中,s 是一个长度为 3,容量为 10 的 slice,指向了底层数组 arr

slice 的动态增长和缩小是通过内置函数 append 实现的。当 slice 的容量不足以容纳需要添加的元素时,append 会创建一个新的底层数组,并将旧数组中的元素复制到新数组中。例如:

s = append(s, 11)

这段代码会将 11 添加到 slice s 的末尾,并返回一个新