我的博客搬家啦,欢迎光临~ 月一orange - 博客园 今天没吃橘子
slice扩容代码在go/src/runtime/slice.go
中,当前使用的使用的golang源码是GitHub中的master分支代码。时间是2021-10-11
。
先抛出一个问题,你觉得应该是打印多少呢?
var b = []int64{1, 1}
b = append(b, 1, 1, 1)
fmt.Println("cap:", cap(b))
入参
slice.go中的growslice
函数是扩容相关的代码,其中et可以理解为一个记录切片元数据的结构,在代码中常用et.size
来获取切片元素的字节个数,比如一个[]byte
类型的切片,它的et.size
就是1。
old slice
就是还未扩容的切片。cap
是期望的切片容量,比如当前切片有3个元素,再往里加入2个元素,期望的容量就是5。
func growslice(et *_type, old slice, cap int) slice {
出参
growslice
最终返回了一个新的slice,其中参数p是新申