在golang 切片的帽子和镜头有什么不同?
根据定义:
切片既有长度又有容量.
切片的长度是它包含的元素的数量.
切片的容量是底层数组中的元素数,从切片中的第一个元素开始计算.
x := make([]int, 0, 5) // len(b)=0, cap(b)=5
len是否仅表示非空值?
在golang 切片的帽子和镜头有什么不同?
根据定义:
切片既有长度又有容量.
切片的长度是它包含的元素的数量.
切片的容量是底层数组中的元素数,从切片中的第一个元素开始计算.
x := make([]int, 0, 5) // len(b)=0, cap(b)=5
len是否仅表示非空值?
片是在幕后使用数组的抽象.
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 6, len 4, 0x10432220
cap 6, len 5, 0x10432220
正如您所见,一旦满足容量,append
将返回一个容量更大的新片.在第四次迭代中,你会发现一个更大的容量和一个新的指针地址.
我知道您没有问到数组和追加的问题,但是它们对于理解片断和内置的原因是非常基础的.