make()Go
make(Type, len, cap)
TypeTypeslicemapchannellenmapchannelslicecap
make()
make(map[string]string)

make([]int, 2)

make([]int, 2, 4)
mapchannel
make()capcaplen

为了更好的理解动态数组向扩容,这里先写一段演示代码:

data := make([]int, 0)

for i, n := 0, 20; i < n; i++ {
		data = append(data, 1)
		fmt.Printf("len=%d cap=%d\n", len(data), cap(data))
}

运行结果:

len=1 cap=1		# 第一次扩容
len=2 cap=2		# 第二次扩容
len=3 cap=4		# 第三次扩容
len=4 cap=4
len=5 cap=8		# 第四次扩容
len=6 cap=8
len=7 cap=8
len=8 cap=8
len=9 cap=16	# 第五次扩容
len=10 cap=16
len=11 cap=16
len=12 cap=16
len=13 cap=16
len=14 cap=16
len=15 cap=16
len=16 cap=16
len=17 cap=32	# 第六次扩容
len=18 cap=32
len=19 cap=32
len=20 cap=32

结果确实是动态数组每次扩容都是原来的两倍,那么思考一下动态数组会一直这样扩容下去吗?

data := make([]int, 0)

for i, n := 0, 10000; i < n; i++ {
		data = append(data, 1)
		if len(data) == cap(data) {
				fmt.Printf("len=%d cap=%d\n", len(data), cap(data))
		}
}

运行结果:

len=1 cap=1
len=2 cap=2
len=4 cap=4
len=8 cap=8
len=16 cap=16
len=32 cap=32
len=64 cap=64
len=128 cap=128
len=256 cap=256
len=512 cap=512
len=1024 cap=1024
len=1280 cap=1280
len=1696 cap=1696
len=2304 cap=2304
len=3072 cap=3072
len=4096 cap=4096
len=5120 cap=5120
len=7168 cap=7168
len=9216 cap=9216
11122048
n