知识卡片

Append可能换底座

普通读书笔记卡 · 1473.a

内容

append 在容量足够时复用原数组,容量不足时分配新数组并复制旧数据。依赖 append 后仍共享或不共享都会出错,关键是把容量变化视为潜在的结构迁移。

参考来源

- 位置:《Go语言底层原理剖析》第7章《切片使用方法与底层原理》7.2.3节《切片扩容原理》 - 结论依据:原文给出切片扩容的具体策略——"如果新申请容量大于2倍的旧容量,则最终容量是新申请的容量""如果旧切片的长度小于1024,则最终容量是旧容量的2倍",并强调"扩容后新的切片不一定拥有新的地址。因此在使用append函数时,通常会采用a=append(a,T)的形式",因此可以推出"append 在容量不足时会分配新底层数组并复制数据"的结论。 - 原始内容:append函数在运行时调用了runtime/slice.go文件下的growslice函数……如果新申请容量(cap)大于2倍的旧容量(old.cap),则最终容量(newcap)是新申请的容量(cap)。如果旧切片的长度小于1024,则最终容量是旧容量的2倍……如果切片需要扩容,那么最后需要到堆区申请内存。要注意的是,扩容后新的切片不一定拥有新的地址。因此在使用append函数时,通常会采用a=append(a,T)的形式。