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)
}
// 输出:
// 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

因此,通常最好的做法是在首次创建切片时分配足够的容量(如果您知道需要多少空间),以避免不必要的重新分配。