注: 结果可能与操作系统位数有关. 本人当前使用的操作系统 Mac Pro 64 位操作系统
搜索了相关的信息, 看到的别人总结的机制是这样的:
- 当 cap(s) < 1024 时, 新的 size = cap(s) * 2
- 当 cap(s) >= 1024 时, 新的 size = cap(s) * 1.25
先不说对不对, 至少这两条规则是没有覆盖到所有场景的, 如:
s := []int{1} // cap(s) == 1
s = append(s, 2, 3, 4) // 满足 cap(s) < 1024, 如果是简单的 cap(s) * 2 = 2 都不足以容纳 `1, 2, 3, 4` 合计 4 个元素
机制
假设: var s []int
当 cap(s) < 1024 时, 新的 size = cap(s) * 2
但实际并不完全是这样: https://play.golang.org/p/Tj4SS-gwzIS
当 cap(s) == 17 时, 结果不是 34
而是 36
.
对于 []byte
, 结果又是另一个样子: https://play.golang.org/p/4TYIMkEZmMn