go slice 扩容
2022-01-19 本文已影响0人
wwq2020
简单总结
1 append后cap超过当前cap的2倍,则采用append后的cap作为cap
2 append后cap未超过当前cap的2倍,且小于1024,则使用当前cap的2被作为cap
3 append后cap未超过当前cap的2倍,但大于等于1024,则通过对当前cap多次*1.25尝试找出大于append后的cap的值
3.1 如果未溢出,则使用这个计算出来的值
3.2 如果溢出了,则使用append后的cap
相关源码
go中append操作对应的源码在标准库的runtime/slice.go中
func growslice(et *_type, old slice, cap int) slice {
...
newcap := old.cap
doublecap := newcap + newcap
if cap > doublecap {
newcap = cap
} else {
if old.cap < 1024 {
newcap = doublecap
} else {
// Check 0 < newcap to detect overflow
// and prevent an infinite loop.
for 0 < newcap && newcap < cap {
newcap += newcap / 4
}
// Set newcap to the requested cap when
// the newcap calculation overflowed.
if newcap <= 0 {
newcap = cap
}
}
}
...
}