一个例子看 go slice 的内存预分配
例子
package main
import "fmt"
func main() {
s := []int{}
fmt.Println("len", "cap")
for i := 0; i < 17; i++ {
s = append(s, i)
fmt.Printf("%2d%4d\n", len(s), cap(s))
}
}
结果
len cap
1 1
2 2 <---cap不够了,分配原来的2倍
3 4 <---cap不够了,分配原来的2倍
4 4
5 8
6 8
7 8
8 8
9 16 <---cap不够了,分配原来的2倍
10 16
11 16
12 16
13 16
14 16
15 16
16 16
17 32 <---cap不够了,分配原来的2倍
分析
从结果中可知cap的量是2的n次方增长的