登录
首页 >  Golang >  Go问答

为何 cap 不能获取底层数组的长度?

来源:stackoverflow

时间:2024-03-23 19:48:29 368浏览 收藏

在 Go 中,切片的容量表示底层数组中为切片分配的空间元素数量。它与底层数组的长度不同,因为容量是从切片第一个元素开始计算的。当通过切片后备数组创建切片时,其低索引为 0(或省略),高索引为数组长度(或省略),此时容量等于数组长度。但是,如果切片的第一个元素与后备数组的第一个元素不同,容量将小于数组长度。

问题内容

我正在阅读《a tour of go》,在切片长度和容量部分,我运行了示例:

package main

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]

在go文档中,cap是底层数组的长度,为什么它的值不是6?


解决方案


在go文档中,cap是底层数组的长度,为什么它的值不是6?

因为容量不是后备数组的大小(在特殊情况下它们可能相等,但一般情况下它们不相等)。当通过切片后备数组创建切片时,使用 0 作为低索引(或省略它),并使用数组长度作为高索引(或省略它),那么是的,容量将等于数组的长度。

Spec: Length and capacity:

切片的容量是底层数组中为其分配空间的元素数量。

因此容量从切片的第一个元素开始,如果它与后备数组的第一个元素不同,它们将不相等。您链接的 Tour page 中也明确说明了这一点:

切片的容量是基础数组中的元素数量,从切片中的第一个元素开始计算

还有一个 full slice expression,其形式为:

a[low : high : max]

在您可以控制生成的切片容量的地方,您可以限制将来的切片可以将切片扩展多远。 max 索引可能指向数组最后一个元素之前的元素。

请参阅此示例:

a := [10]int{}

s := a[:] // len=10, cap=10
fmt.printf("len=%d, cap=%d\n", len(s), cap(s))

s = a[2:] // len=8, cap=8
fmt.printf("len=%d, cap=%d\n", len(s), cap(s))

s = a[2:7] // len=5, cap=8
fmt.printf("len=%d, cap=%d\n", len(s), cap(s))

s = a[2:7:8] // len=5, cap=6
fmt.printf("len=%d, cap=%d\n", len(s), cap(s))

输出(在 Go Playground 上尝试):

len=10, cap=10
len=8, cap=8
len=5, cap=8
len=5, cap=6

当您删除前两个值时,您将仅保留基础数组中的最后 4 个剩余项目。

[2 3 5 7 11 13]

当您执行 s = [:0] 时,切片的长度将为 0,上限为 6:[]2 3 5 7 11 13

当您执行 s = [:4] 时,切片的长度将为 4,上限为 6:[2 3 5 7] 11 13

当您执行 s = [2:] 时,切片的长度将为 2,上限为 4: 2 3 [5 7] 11 13

这是因为该数组无法再访问前两个值,而如果扩展切片的长度,仍然可以访问后两个值。

理论要掌握,实操不能落!以上关于《为何 cap 不能获取底层数组的长度?》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>