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
}
}
}
给定一个期望扩容数字:
- 如果期望大于两倍的老容量,那么新的容量就是这个期待容量
- 如果期望小于两倍的老容量,并且老的容量个数小于1024,那么新的容量就是老容量的二倍
- 如果期望小于两倍的老容量,并且老的容量个数大于1024,那么这个容量就按照之前老容量的1.25倍开始增加,直到大于了期望容量,开始跳出循环
- 如果老容量是小于等于0的,那么新的容量直接等于期望容量
当然这只是初步确定容量,下面还要进行内容的对齐。