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

我还很陌生,这个例子让我感到困惑:


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 %v\n", 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?根据定义,容量是底层数组的长度。


慕姐8265434
浏览 98回答 2
2回答

PIPIONE

Slice 建立在数组之上,它由指向数组的指针、段的长度和它的容量(段的最大长度)组成。关键是segment,不是array。    s = s[2:]当你删除前两个值时,s变成了一个指向数组另一半段的切片,从第三个元素开始,所以它的 cap 是4.就像你不能做一个s[-1]指向数组的前一部分,那部分不能算进cap.参考:https ://blog.golang.org/slices-intro

蝴蝶不菲

切片的容量是底层数组中元素的数量,从切片中的第一个元素开始计数。在您的示例中,在最后一种情况下,切片的起始元素是 5,并且在 5 的基础数组({2, 3, 5, 7, 11, 13}) 位置中是 2。要计算容量,您应该从index 2. 如果你从那个位置算起,你会得到正确的容量 4
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go