package main
import "fmt"
func main() {
var s []int
printSlice(s)
s = append(s, 0)
printSlice(s)
s = append(s, 1)
printSlice(s)
s = append(s, 2, 3, 4)
printSlice(s)
}
func printSlice(s []int) {
fmt.Printf("len=%d cap=%d %v\n", len(s), cap(s), s)
}
得到的结果是
len=0 cap=0 []
len=1 cap=1 [0]
len=2 cap=2 [0 1]
len=5 cap=6 [0 1 2 3 4]
底层数组也只有5个元素啊,为什么最后的cap是6而不是5?
<a href="/user/hanmingyu" title="@hanmingyu">@hanmingyu</a> 如果切片的len超过cap,切片会改变cap的大小,这时要重新分配内存将原来的数据拷贝到新分配的内存里面,如果只是cap改为和len一样大,下次再append,又要做拷贝,这是非常低效率的,所以cap不足时改变的原则是将cap扩展为len的2倍
#4