Go的Slice如何扩容 ?
Go中的切片(Slice)扩容是通过内建函数 append()
来完成的。当我们向切片中添加元素,并且切片的容量不足时,切片就会自动进行扩容。
切片的扩容规则如下:
- 如果切片的容量小于1000,那么扩容的时候就会直接翻倍,例如
len=512
,那么cap=1024
。 -
如果切片的容量大于等于1000,那么扩容的时候会增加25%,例如
len=1024
,那么cap=1280
。
扩容操作会创建一个新的底层数组,同时保持所有原始数据,然后返回这个新切片的引用。原始切片和新切片是完全独立的,修改任一切片的内容都不会影响另一个。
以下是一个使用 append()
对切片进行扩容的示例:
package main
import "fmt"
func main() {
s := make([]int, 0, 1) // 创建一个初始容量为1的切片
fmt.Printf("Initial capacity: %d\n", cap(s))
for i := 1; i <= 20; i++ {
s = append(s, i) // 向切片中添加元素
fmt.Printf("Capacity after appending %d elements: %d\n", i, cap(s))
}
}
在这个例子中,每次添加元素时,如果切片的容量不足,append()
就会自动扩大容量。