Escape analysis - анализ компилятора, который решает, можно ли переменную разместить на стеке или она должна жить в куче ("убегает" из функции). Если указатель на переменную возвращается или сохраняется в глобальном/куче - переменная размещается в куче.
func getPtr() *int {
x := 42 // x "убегает" - возвращается указатель
return &x
}
func noEscape() int {
x := 42
return x // x на стеке
}
go build -gcflags="-m" . 2>&1 | grep escape
// output: ... moved to heap: x
Размещение в куче увеличивает нагрузку на GC. Иногда можно переписать код так, чтобы данные оставались на стеке (например, не возвращать указатель на локальную переменную).