原来的cap计作old_cap, 须要的cap计作need_cap, 最初失去的cap计作new_cap. 只探讨need_cap > old_cap的状况.

如果need_cap > old_cap*2, new_cap = need_cap

如果need_cap < old_cap*2, 且old_cap < 1024, new_cap = old_cap*2

如果need_cap < old_cap*2, 但old_cap > 1024, 则new_cap=old_cap, 并在new_cap<need_cap的条件下, new_cap = new_cap*1.25. 因为need_cap < old_cap*2, 所以最多也就循环4次. 在这种状况下如果new_cap溢出了, new_cap = need_cap.

附上源码

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            }        }    }

举一些例子来阐明

  1. old=10, need=50, new=50
  2. old=10, need=14, new=20
  3. old=2000, need=3000, new=old*1.25*1.25=3125
  4. old=MaxInt/2+1, need=MaxInt-1, 因为old*2溢出,new=MaxInt-1

又一次体现了缩小内存迁徙和缩小内存节约之间的衡量