请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于slice cap的问题

package main
import "fmt"
func main() {
var numbers []int
printSlice(numbers)
/* 允许追加空切片 */
numbers = append(numbers, 0, 100)
printSlice(numbers)

/* 向切片添加一个元素 */
numbers = append(numbers, 1)
printSlice(numbers)

/* 同时添加多个元素 */
numbers = append(numbers, 2, 3, 4)
printSlice(numbers)

/* 创建切片 numbers1 是之前切片的两倍容量*/
numbers1 := make([]int, len(numbers), (cap(numbers))*2)

/* 拷贝 numbers 的内容到 numbers1 */
copy(numbers1, numbers)
printSlice(numbers1)

}
func printSlice(x []int) {
fmt.Printf(“len=%d cap=%d slice=%v\n”, len(x), cap(x), x)
}

运行结果:
len=0 cap=0 slice=[]
len=2 cap=2 slice=[0 100]
len=3 cap=4 slice=[0 100 1] #这里的cap 为啥是4不是3吗?
len=6 cap=8 slice=[0 100 1 2 3 4]
len=6 cap=16 slice=[0 100 1 2 3 4]
JasondeMacBook-Pro:golearing jason$

正在回答 回答被采纳积分+3

1回答

ccmouse 2021-05-15 12:50:51

我在本节的7:00左右也演示了这个行为。它并不是添加多少元素就分配多少空间的,它会多分配一些空间,使得我们连续添加的时候不至于每次都要重新分配。比如这里,cap=4,我们继续append一个元素的话,就不会造成空间的再分配。

我们视频里也看到,在比较小的情况下,它的分配是指数递增的,但是当slice较大的情况下(>1024),会按照25%的增量进行分配。当然这些并没有一个规定,只是目前的实现。

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信