长度和容量

切片有长度和容量。切片的长度是切片中当前元素的数量,而容量是切片在需要重新分配之前可以保留的元素数量。

使用内置 make() 函数创建切片时,你可以指定其长度以及可选的容量。如果未明确指定容量,则它将是指定的长度。

var s = make([]int, 3, 5) // length 3, capacity 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)
}
// output:
// 0 0
// 1 0
// 2 0

在 play.golang.org 上运行它

即使索引在容量范围内,也无法访问超出切片长度的元素:

var x = s[3] // panic: runtime error: index out of range

但是,只要容量超过长度,你就可以追加新元素而无需重新分配:

var t = []int{3, 4}
s = append(s, t) // s is now []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 is now []int{0, 0, 0, 3, 4, 5, 6}
n = len(s) // n == 7
c = cap(s) // c > 5

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