在 Go 语言中,切片在追加元素导致容量不足时,其容量是按什么规则进行扩容的?
考察说明
考查 Go 语言切片底层数组扩容机制的理解。
回答思路
- 【回答框架 1】Go 切片由指向底层数组的指针、长度 len 和容量 cap 构成。当 append 导致长度超过容量时,会分配新的底层数组并拷贝旧元素。
- 【回答框架 2】扩容策略:当期望容量大于旧容量的两倍时,直接扩容到期望容量;否则,当旧容量小于 256 时,新容量为旧容量的 2 倍;当旧容量大于等于 256 时,新容量按约 1.25 倍增加,并向上取整到内存分配的对齐大小。
- 【回答框架 3】实际分配容量还受内存分配器对齐影响,最终容量可能略大于计算值。
- 【回答框架 4】扩容会创建新数组并复制旧元素,原切片与新切片共享底层数组的关系被切断;若原切片未扩容,则修改可能相互影响。
- 【回答框架 5】在 Go 1.18 前阈值是 1024,扩容倍率不同,但当前版本以 Go 1.18 后的策略为准,面试通常关注大体规则。
- 【关键点 1】Go 1.18 后小容量(<256)按 2 倍扩容,大容量按 1.25 倍扩容。
- 【关键点 2】当追加后所需容量超过当前容量 2 倍时,直接扩容到所需容量。
- 【关键点 3】实际容量受内存对齐影响,可能大于计算值。
- 【易错点 1】忽略版本差异,旧版本扩容策略不同,需说明是 Go 1.18 后的规则。
- 【易错点 2】错误认为扩容一定是精确的整数倍。
- 【易错点 3】忽略扩容后原切片与新切片不再共享底层数组。