首先贴上官方文档,教程代码如下:

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]

值得注意的是前三条数组长度和容量是一致的,第四个就不一样了。经过查阅资料发现,数组的扩容是一定要是偶数。
但是这还没完,到底是如何扩容呢,且看接下来几组实验:

package main

import "fmt"

func main() {
	var s []int
	printSlice(s)

	// 第0次添加1个,总和1个
	s = append(s, 0)
	printSlice(s)

	// 第1次添加1个,总和2个
	s = append(s, 1)
	printSlice(s)

	// 第2次添加3个,总和5个
	s = append(s, 2, 2, 2)
	printSlice(s)

	//第3次添加2个,总和7个
	s = append(s, 3, 3)
	printSlice(s)

	//第4次添加4个,总和11个
	s = append(s, 4, 4, 4, 4)
	printSlice(s)

	//第5次添加2个,总和13个
	s = append(s, 5, 5)
	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 2 2]
len=7 cap=12 [0 1 2 2 2 3 3]
len=11 cap=12 [0 1 2 2 2 3 3 4 4 4 4]
len=13 cap=24 [0 1 2 2 2 3 3 4 4 4 4 5 5]

根据上述我们基本可以得出一个规律,首先在append之后都要判断一下是否超容,如果超容,则新数组的容量首先扩大为原来的两倍。另外还有一条规律,当扩容之后再次比较发现容量还是不够用,就只会补够到相对应的容量数(当然前提还是要偶数),例子如下:

package main

import "fmt"

func main() {
	var s []int
	printSlice(s)

	// 第0次添加1个,总和1个
	s = append(s, 0)
	printSlice(s)

	// 第1次添加1个,总和2个
	s = append(s, 1)
	printSlice(s)

	// 第2次添加3个,总和5个
	s = append(s, 2, 2, 2)
	printSlice(s)

	//第3次添加2个,总和7个
	s = append(s, 3, 3)
	printSlice(s)

	//第4次添加18个,总和25个
	s = append(s, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 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 2 2]
len=7 cap=12 [0 1 2 2 2 3 3]
len=25 cap=26 [0 1 2 2 2 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4]

在第4次添加元素的时候因为一次性添加的个数过多,超过了原来数组容量的两倍,需要再次补位,但出乎意料的是,容量不是12×3=36而是24+2=26了。

总结一下:
1、append后判断是否超容,倘若超容,新数组容量为原数组容量乘2;
2、数组长度如果还是超容,新数组容量以2的倍数补足。

欢迎大家纠正补充。