Go 语言切片如何扩容?(全面解析原理和过程)

一、go1.18 之前:
1.如果期望容量大于当前容量的两倍就会使用期望容量;
2.如果当前切片的长度小于 1024 就会将容量翻倍;
3.如果当前切片的长度大于 1024 就会每次增加 25% 的容量,直到新容量大于期望容量;

二、go1.18 之后:
1.如果期望容量大于当前容量的两倍就会使用期望容量;
2.如果当前切片的长度小于阈值(默认 256)就会将容量翻倍;
3.如果当前切片的长度大于等于阈值(默认 256),就会每次增加 25% 的容量,基准是 newcap + 3*threshold,直到新容量大于期望容量;

总的来说,Go的设计者不断优化切片扩容的机制,其目的只有一个:就是控制让小的切片容量增长速度快一点,减少内存分配次数,而让大切片容量增长率小一点,更好地节省内存。

如果只选择翻倍的扩容策略,那么对于较大的切片来说,现有的方法可以更好的节省内存。
如果只选择每次系数为1.25的扩容策略,那么对于较小的切片来说扩容会很低效。
之所以选择一个小于2的系数,在扩容时被释放的内存块会在下一次扩容时更容易被重新利用。
————————————————

参考文档:

https://blog.csdn.net/qq_47831505/article/details/135540661