【问题标题】:When is capacity different from end of array - start of slice?容量何时与数组末尾不同 - 切片开头?
【发布时间】:2020-08-01 00:59:45
【问题描述】:

Go Programming Language 书中,作者陈述了以下内容(在关于切片的第 4.2 节):

[切片的]长度是切片元素的数量;它不能超过容量,通常是切片开头和底层数组结尾之间的元素数。

问题

由于作者选择使用“通常”这个词,这意味着实际上存在切片的容量与切片开始之间的元素数量不同的情况以及底层数组的结尾---什么时候会这样?

也就是说,下面的表达式什么时候会是true

cap(mySlice) != len(underlyingArray) - startIndexOfSlice

我能想到的唯一情况是切片是nil,在这种情况下将没有底层数组。

【问题讨论】:

    标签: arrays go slice


    【解决方案1】:

    完整的slice expression 可以设置容量不足完整的底层数组。

    x := make([]string, 20)
    y := x[0:10:10]
    
    fmt.Println("x:", len(x), cap(x)) // prints x: 20 20
    fmt.Println("y:", len(y), cap(y)) // prints y: 10 10
    

    切片xy共享同一个底层数组,但是y的容量小于x的容量。

    【讨论】:

    • 谢谢!我不知道切片表达式的这种变化。这就像切片s[i:j] 的镜像操作,其中低索引为i > 0,生成的切片永远失去对索引为< i 的基础数组中元素的引用。
    猜你喜欢
    • 2016-11-30
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 2017-09-12
    • 1970-01-01
    • 1970-01-01
    • 2020-01-05
    • 2017-04-17
    相关资源
    最近更新 更多