golang slice 错误认知


很多人在博客看到 slice 扩容策略如下
  • 当大于 1024 则1.5倍
  • 大于1024则两倍
这个结论是错误的
  a:= []int{1,2}
  a=  append(a,3,4,5)

 // 如果是2倍应该 容量是8  但是实际 5

####### 查阅源码 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
			}
		}
	}
   ...
}

####### 源码得知是根据

  • 容量计算的是否溢出 不溢出直接使用 增加的容量
  • 根据 roundupsize 内存对齐函数 比较测算容量
  • 不通的数据类型的 扩容长度也不一样