長度和容量

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

使用內建 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

因此,如果你知道需要多少空間,那麼在首次建立切片時分配足夠的容量通常是一種很好的做法,以避免不必要的重新分配。