> Как определяется, куда положить переменную в памяти, и кто это определяет (Go)

Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы

Компании: Employcity

Стек: Go

> Пример ответа

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

  • Если переменная не "ускользает" (не передается по указателю в другие функции, не возвращается, не сохраняется в глобальной структуре), она размещается на стеке - это быстро и не требует сборки мусора.
  • Если переменная "ускользает" (например, возвращается указатель на локальную переменную, или она захватывается замыканием), компилятор выделяет память в куче (heap allocation), чтобы гарантировать её доступность после завершения функции.

Пример:

GO
func foo() *int {
x := 42
return &x // x ускользает - будет в куче
}

В этом случае x не может остаться на стеке, так как указатель на неё возвращается наружу.

Go также использует оптимизации, такие как встраивание функций и анализ размера, чтобы минимизировать выделения в куче. Разработчик может проверить решения компилятора с помощью флага -gcflags="-m" при сборке.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью