为什么切片的容量会发生变化?不应该是一样的吗?



我是个新手,这个例子让我很困惑:

import "fmt"
func main() {
s := []int{2, 3, 5, 7, 11, 13}
printSlice(s)
// Slice the slice to give it zero length.
s = s[:0]
printSlice(s)
// Extend its length.
s = s[:4]
printSlice(s)
// Drop its first two values.
s = s[2:]
printSlice(s)
}
func printSlice(s []int) {
fmt.Printf("len=%d cap=%d %vn", len(s), cap(s), s)
}

输出:

len=6 cap=6 [2 3 5 7 11 13]
len=0 cap=6 []
len=4 cap=6 [2 3 5 7]
len=2 cap=4 [5 7]

为什么最后一次的容量变为4?容量的定义是底层阵列的长度。

Slice建立在数组上,它由指向数组的指针、段的长度及其容量(段的最大长度(组成。

关键是segment,而不是array

s = s[2:]

当您去掉前两个值时,s变成了一个指向数组另一半段的切片,从第三个元素开始,因此它的cap是4

就像不能用s[-1]来指向数组的前一部分一样,该部分也不能计入cap

参考:https://blog.golang.org/slices-intro

切片的容量是底层数组中的元素数,从切片中的第一个元素开始计数。

在您的示例中,在最后一种情况下,切片的起始元素是5,而在下面的arrray({2,3,5,7,11,13}(中,5的poison是2。要计算容量,您应该从索引2开始计数。如果你从那个位置计数,你会得到正确的容量4

相关内容

最新更新