逃逸分析 (Escape Analysis) 是 Go 编译器在编译期通过追踪局部变量(包括函数参数与返回值)的生命周期,决定将其分配在 栈 (Stack) 还是 堆 (Heap) 的决策机制。

为什么是局部变量

因为全局变量、常量、类型信息等在程序启动时就已经确定了位置。他们的生命周期贯穿整个进程,因此不需要逃逸分析来决定去处。

核心逻辑

编译器根据“安全性”进行决策:

  • 不逃逸:变量仅在函数内部使用,且生命周期随函数结束而终止 分配在 (效率极高)。
  • 逃逸:变量在函数外部仍被引用,或编译器无法确定其生命周期 分配在 (由 GC 负责清理)。

为什么重要

  • 提升性能:栈分配仅需移动指针,远快于堆分配。
  • 减轻 GC 压力:尽可能将变量留在栈上,可以显著减少垃圾回收的频率和时长。
  • 开发透明:开发者无需手动管理内存(如 C++ 的 malloc/free),编译器自动实现性能最优解。

常见逃逸场景

详细案例请参考:无法确定生命周期的常见场景。

这些场景背后的本质是:编译器无法在编译期 100% 保证变量在函数返回后不再被引用