一尘不染

盖vs片的镜头

go

golang中的cap和len之间有什么区别?

根据定义:

切片既有长度又有容量。

切片的长度是其包含的元素数。

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

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

len是否仅表示非null值?


阅读 213

收藏
2020-07-02

共1个答案

一尘不染

切片是一种抽象,它在后台使用数组。

cap告诉您基础数组的容量。len告诉您数组中有多少个项目。

Go中的slice抽象非常好,因为它将为您调整基础数组的大小,此外,Go中的数组无法调整大小,因此几乎总是使用slice。

例:

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 6, len 4, 0x10432220
cap 6, len 5, 0x10432220

如您所见,一旦满足容量要求,append将返回具有更大容量的新切片。在第4次迭代中,您将注意到更大的容量和新的指针地址。

播放范例

我知道您没有询问数组和追加,但是它们是了解切片和内置原因的基础。

2020-07-02