golang中的cap vs len

时间:2017-01-16 00:51:24

标签: go slice

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

根据定义:

切片同时具有长度和容量。

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

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

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

len是否仅表示非空值?

4 个答案:

答案 0 :(得分:51)

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

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次迭代中,您将注意到更大的容量和新的指针地址。

Play example

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

答案 1 :(得分:2)

来自source code

edit_handler

答案 2 :(得分:0)

您已回答了您的问题 - 切片中基础数组的长度不一定与数组包含的元素数相同。

答案 3 :(得分:0)

@jmaloney

我得到了这个结果。

osboxes@robuntu:~/go/src/hello$ ./hello 
cap 3, len 1, 0xc000016460
cap 3, len 2, 0xc000016460
cap 3, len 3, 0xc000016460
cap 6, len 4, 0xc00001a240
cap 6, len 5, 0xc00001a240