我是个新手,这个例子让我很困惑:
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