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
的末尾,并返回一个新
Copyright © 2022-2023, Koudai Team