【问题标题】:why is the capacity of the slice changing? shouldn't it be the same?为什么切片的容量会发生变化?不应该是一样的吗?
【发布时间】:2020-12-31 06:34:39
【问题描述】:

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

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

【问题讨论】:

    标签: arrays go slice


    【解决方案1】:

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

    关键点是segment,而不是array

        s = s[2:]
    

    当你删除前两个值时,s 变成了一个指向数组另一半段的切片,从第三个元素开始,所以它的上限是 4

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

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

    【讨论】:

    • 现在明白了。我会将 Slices 视为对数组片段而不是整个数组的引用。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-28
      • 1970-01-01
      • 1970-01-01
      • 2022-07-29
      • 1970-01-01
      • 1970-01-01
      • 2017-08-22
      • 2017-05-09
      相关资源
      最近更新 更多