当前位置:  开发笔记 > 编程语言 > 正文

golang中的cap vs len

如何解决《golang中的capvslen》经验,为你挑选了1个好方法。

golang中一个切片的cap和len有什么区别?

根据定义:

切片具有长度和容量.

切片的长度是它包含的元素数.

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

x := make([]int, 0, 5) // len(b)=0, cap(b)=5

len是否仅表示非空值?



1> jmaloney..:

切片是一种在封面下使用数组的抽象.

cap告诉你底层数组的容量.len告诉你数组中有多少项.

Go中的切片抽象非常好,因为它会为您调整底层数组的大小,而且Go数组中的大小不能调整大小,因此几乎总是使用切片.

例:

s := make([]int, 0, 3)
for i := 0; i < 5; i++ {
    s = append(s, i)
    fmt.Printf("cap %v, len %v, %p\n", cap(s), len(s), s)
}

会输出这样的东西:

cap 3, len 1, 0x1040e130
cap 3, len 2, 0x1040e130
cap 3, len 3, 0x1040e130
cap 8, len 4, 0x10432220
cap 8, len 5, 0x10432220

正如您所看到的那样,只要满足容量,append就会返回一个容量更大的新切片.在第4次迭代中,您将注意到更大的容量和新的指针地址.

播放示例

我意识到你没有问过数组和追加,但它们在理解切片和内置的原因方面非常基础.


与切片不同的@BradEllis数组没有nil值.当你创建一个数组`var array [3] int`时,你明确地分配了一个数组的容量和长度.在谈到Go中的数组时,cap和len函数是相同的.您需要记住Go中的切片是一种利用数组但不是数组的数据类型.因此,当你调用`cap(someSlice)`时,你正在检查下划线数组的容量或长度,但当你调用`len(someSlice)时,你正在检查你明确添加到切片中的项数.例如:https://play.golang.org/p/ahlHLkD4_Wt
好答案。OP可能不再关心,但我可以看到这对很多可能会发现它的人有所帮助。
@RandyHoward谢谢,我很感激.我发现知道指针地址变得非常重要.
推荐阅读
php
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有