Где размещаются переменные в Go — стек или куча? Что такое escape analysis?

В Go расположение переменной (на стеке или куче) определяется компилятором с помощью анализа escape analysis.

Короткий ответ

Что ответить на собеседовании

В Go расположение переменной (на стеке или куче) определяется компилятором с помощью анализа escape analysis. Если переменная "убегает" за пределы функции, например, возвращается из неё или сохраняется в глобальную область, то она размещается в куче, чтобы сохранить жизненный цикл.

Подробный разбор

Ответ с пояснениями

В Go расположение переменной (на стеке или куче) определяется компилятором с помощью анализа escape analysis. Если переменная "убегает" за пределы функции, например, возвращается из неё или сохраняется в глобальную область, то она размещается в куче, чтобы сохранить жизненный цикл.

Escape analysis — это процесс компилятора, который определяет, какие переменные могут быть размещены на стеке (быстрее, с автоматическим освобождением) и какие должны быть выделены в куче (с управлением временем жизни через сборщик мусора).

Пример:

func foo() *int {
    x := 10 // x может "убежать"
    return &x // возвращаем адрес x, значит x должен быть в куче
}

func bar() {
    y := 20 // y не убегает за пределы bar
    fmt.Println(y) // y может быть на стеке
}

В первом случае переменная x будет размещена в куче, во втором — y на стеке.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее