本文档旨在引导你自主阅读 Go 1.21 的 slice 源码

把下面内容当作阅读源码前的准备清单与思考题。

推荐阅读

核心结构与基础

在开始阅读代码前,请先思考并尝试在源码中找到以下问题的答案:

重点函数:growslice

这是切片扩容的核心逻辑,位于 src/runtime/slice.go。阅读时请关注:

  • 扩容策略
    • 在 Go 1.18 之后,扩容阈值从 1024 变成了多少?
    • 为什么不再是简单的“翻倍”?
  • 内存对齐(Round Up)
    • 扩容计算出的新容量(newcap)就是最终申请的内存大小吗?
    • 寻找代码中关于 roundupsize 的调用,理解它如何根据内存规格调整容量。
  • 写屏障与内存拷贝
    • 扩容后旧数据是如何迁移到新内存的?(寻找 memmove

进阶思考

  • 切片作为参数:为什么说 Go 函数传参是“值传递”,但修改切片元素却能影响原切片?
  • 内存泄露风险:在大切片上截取小切片,为什么可能导致内存泄露?源码中是否有相关提示或你能想到的避坑指南?