func growslice(et *_type, old slice, cap int) slice {
newcap := old.cap
doublecap := newcap + newcap
if cap > doublecap {
newcap = cap
} else {
if old.len < 1024 {
newcap = doublecap
} else {
for 0 < newcap && newcap < cap {
newcap += newcap / 4
}
if newcap <= 0 {
newcap = cap
}
}
}
在分配內存空間之前需要先確定新的切片容量,Go 語言根據切片的當前容量選擇不同的策略進行擴容:
- 如果期望容量大於當前容量的兩倍就會使用期望容量;
- 如果當前切片容量小於 1024 就會將容量翻倍;
- 如果當前切片容量大於 1024 就會每次增加 25% 的容量,直到新容量大於期望容量;