2 回答
TA贡献1943条经验 获得超7个赞
这取决于数组中存储的元素的大小
可以在这里看到实现:
https://github.com/golang/go/blob/master/src/runtime/slice.go
但正如你在回顾历史时所看到的那样,它不能随着时间的推移而保持不变。
这也可以解释您可能注意到的不同 Go 版本的差异。
进行一些测试,显示 0 大小的结构如何仅将容量增加 1 个元素,并且 int 或 string 将在每次增长时重复,而 3 字节结构在每次增长时“大致”加倍。
您可以使用不同的类型执行这样的代码,以查看这些不同情况的实际情况:
arr := []struct{}{}
oldCap := 0
for i := 0; i < 100; i++ {
arr = append(arr, struct{}{})
if cap(arr) != oldCap {
oldCap = cap(arr)
fmt.Println("arr", cap(arr))
}
}
游乐场展示了上述案例:
https://play.golang.org/p/OKtCFskbp2t
TA贡献1812条经验 获得超5个赞
根据Go slice内部的信息,append的实现行为如下。
它只是的倍数(len(source slice) + len(new data)) * 2
func AppendByte(slice []byte, data ...byte) []byte {
m := len(slice)
n := m + len(data)
if n > cap(slice) { // if necessary, reallocate
// allocate double what's needed, for future growth.
newSlice := make([]byte, (n+1)*2)
copy(newSlice, slice)
slice = newSlice
}
slice = slice[0:n]
copy(slice[m:n], data)
return slice
}
- 2 回答
- 0 关注
- 116 浏览
添加回答
举报