切片扩容
Go语言中切片扩容策略:
当调用Append
函数向切片中添加元素时,可能导致切片的扩容。根据你调用Append
函数的方式不同,切片有两种扩容方式:
-
调用
Append
函数向切片中添加一个元素。此时的扩容策略是当容量不足时,扩容至原容量的两倍,明显是土财主的做法;但是如果原切片容量已经超过了1024,那么切片容量将只会增加25%,也就是增加原容量的四分之一,谁让地主家也没有余粮呢。需要注意的是,如果原切片容量为零,那么就直接等于所需容量,也就是1。slice = make([]int, 0) // cap:0 slice = append(slice, 1) // cap:1 slice = append(slice, 1) // cap:2 slice = append(slice, 1) // cap:4
-
调用
Append
函数向切片中添加多个元素。此时可能出现的一种情况是原切片容量扩大一倍之后任然装不下所有新增的元素,扩容策略是将容量扩展至大于等于所需容量的最小偶数。如果能装下那最好了,直接按原本的计划扩容就行了。比如原切片有1个元素,又添加了2个元素,那么所需容量为3,扩容后的容量为2,不够。比3大的最小偶数是4,因此此时扩容的结果就是4。slice = make([]int, 0) // cap:0 slice = append(slice, 1, 1, 1) // cap:4 slice = append(slice, 2, 2) // cap:6