Вопрос проверяет понимание escape analysis в Go и его влияния на производительность через распределение памяти в стеке или куче.
Escape analysis — это механизм компилятора Go, который анализирует, где должна быть размещена переменная: в стеке или в куче. Если переменная не используется за пределами функции, она остаётся в стеке — это быстро и эффективно. Если же ссылка на неё передаётся наружу (например, возвращается или сохраняется в глобальной структуре), переменная "убегает" в кучу, что требует выделения памяти и последующей сборки мусора.
Размещение в стеке практически бесплатно: память выделяется и освобождается при входе и выходе из функции. Куча требует аллокации и участия GC, что может замедлить программу, особенно при большом количестве объектов. Escape analysis помогает минимизировать аллокации в куче, что критично для высоконагруженных систем.
package main
func createInt() *int {
x := 42
return &x // x убегает в кучу, так как возвращается указатель
}
func main() {
p := createInt()
println(*p)
}В этом примере переменная x убегает, потому что указатель на неё возвращается из функции. Если бы мы просто использовали x внутри функции, она осталась бы в стеке.
Почему это важно:
heap аллокации дороже
увеличивается нагрузка на GC
растет latency
Как уменьшить:
избегать возврата указателей без необходимости
уменьшать использование интерфейсов
использовать value вместо pointer, где возможно
Используйте флаг -gcflags '-m' при компиляции: go build -gcflags '-m' main.go. Вы увидите сообщения вроде moved to heap: x.
Escape analysis — это встроенная оптимизация, которая автоматически снижает нагрузку на GC. Понимание её работы помогает писать более производительный код, избегая лишних аллокаций в куче, особенно в критических участках.