Go 长度和容量
示例
切片既有长度又有容量。切片的长度是该切片中当前的元素数,而容量是该切片在需要重新分配之前可以容纳的元素数。
使用内置make()函数创建切片时,可以指定其长度,还可以指定其容量。如果未明确指定容量,则为指定的长度。
var s = make([]int, 3, 5) //长度3,容量5
您可以使用内置len()功能检查切片的长度:
var n = len(s) //n==3
您可以使用内置cap()功能检查容量:
var c = cap(s) //c==5
make()对于切片的元素类型,创建的元素设置为零值:
for idx, val := range s { fmt.Println(idx, val) } //输出: //00 //10 //20
在play.golang.org上运行
即使索引在容量之内,也不能访问超出切片长度的元素:
var x = s[3] //紧急:运行时错误:索引超出范围
但是,只要容量超过长度,就可以追加新元素而无需重新分配:
var t = []int{3, 4} s = append(s, t) //s现在为[]int{0,0,0,3,4} n = len(s) //n==5 c = cap(s) //c==5
如果追加到缺少接受新元素的能力的切片,则将以足够的能力为您重新分配基础数组:
var u = []int{5, 6} s = append(s, u) //s现在为[]int{0,0,0,3,4,5,6} n = len(s) //n==7 c = cap(s) // c > 5
因此,通常最好的做法是在首次创建切片时分配足够的容量(如果您知道需要多少空间),以避免不必要的重新分配。