【发布时间】:2021-09-16 03:36:13
【问题描述】:
我有一个关于切片帽的问题,代码:
var slice []int
list := []int{1,2,3,4,5}
for _,item := range list {
slice = append(slice, item)
}
fmt.Println(len(slice),cap(slice))
如果项目 == 1:len(slice)=1,cap(slice)=1
如果项目 == 2:len(slice)=2,cap(slice)= 1*2
如果项目 ==3:len(slice) = 3,cap(slice) = 2*2
如果项目 == 4:len(slice) = 4,cap(slice) = 4
如果项目 == 5:len(slice) = 5,cap(slice) = 4*2
所以输出:
len(slice) = 5,cap(slice) = 8
没问题,但是当我更改代码时:
var slice []int
slice = append(slice,1,2,3,4,5)
fmt.Println(len(slice),cap(slice))
输出:
len(slice) = 5,cap(slice) = 6
为什么 cap(slice) = 6 ?
【问题讨论】:
-
语言规范没有明确定义当 cap 不够大时追加算法应该做什么。因此,由 Go 运行时的实现者决定上限的增长方式。并且该实现可能会因版本而异。如果您想要了解该算法,那么您所要做的就是阅读源代码。如果您想要反对实施背后的基本原理,那么您可以尝试 go-nuts 邮件列表。作为一个反例尝试
s := make([]int, 0, 4); fmt.Println(cap(append(s, 1,2,3,4,5)))