1、append扩容:
1.1、新添加元素的个数+原来切片的元素个数,若小于原来切片的元素个数的2倍,cap等于原来切片的元素个数的2倍
1.2、新添加元素的个数+原来切片的元素个数,若大于原来切片的元素个数的2倍,cap等于新添加元素的个数+原来切片的元素个数(若此时cap为奇数,自动加1,使cap为偶数)
package main
import "fmt"
func main() {
var numbers []int
numbers = append(numbers,0, 1)
printSlice(numbers)
numbers = append(numbers, 2,3,4)
printSlice(numbers)
}
func printSlice(x []int){
fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}
-----------------result-----------------
len=2 cap=2 slice=[0 1]
len=5 cap=6 slice=[0 1 2 3 4]
2、slice截取扩容:cap等于截取的开始索引到原切片初始容量的元素个数
2.1、b的容量=开始截取索引为0,到a的初始容量5的元素个数,所以cap(b) = 5
2.2、c的容量=开始截取索引为2,到a的初始容量5的元素个数,所以cap(c) = 3
package main
import "fmt"
func main() {
a := make([]int, 0, 5)
printSlice(a)
b := a[:2]
printSlice(b)
c := a[2:4]
printSlice(c)
}
func printSlice(x []int){
fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}
-----------------result-----------------
len=0 cap=5 slice=[]
len=2 cap=5 slice=[0 0]
len=2 cap=3 slice=[0 0]