長度和容量
切片有長度和容量。切片的長度是切片中當前元素的數量,而容量是切片在需要重新分配之前可以保留的元素數量。
使用內建 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
即使索引在容量範圍內,也無法訪問超出切片長度的元素:
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
因此,如果你知道需要多少空間,那麼在首次建立切片時分配足夠的容量通常是一種很好的做法,以避免不必要的重新分配。