切片既有长度又有容量。切片的长度是该切片中当前的元素数,而容量是该切片在需要重新分配之前可以容纳的元素数。
使用内置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) } // 输出: // 0 0 // 1 0 // 2 0
在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
因此,通常最好的做法是在首次创建切片时分配足够的容量(如果您知道需要多少空间),以避免不必要的重新分配。