golang中一个切片的cap和len有什么区别?
根据定义:
切片具有长度和容量.
切片的长度是它包含的元素数.
切片的容量是基础数组中元素的数量,从切片中的第一个元素开始计算.
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 8, len 4, 0x10432220 cap 8, len 5, 0x10432220
正如您所看到的那样,只要满足容量,append
就会返回一个容量更大的新切片.在第4次迭代中,您将注意到更大的容量和新的指针地址.
播放示例
我意识到你没有问过数组和追加,但它们在理解切片和内置的原因方面非常基础.