关于slice cap的问题

来源:3-3 切片的操作

qq_天空_91

2021-05-13

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$

写回答

1回答

ccmouse

2021-05-15

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

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

0
0

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程