> Где в памяти находится переменная: в хипе или в стеке в Go (Go)

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

Компании: Т-Банк

Стек: Go

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

В Go решение о том, где размещается переменная - в куче (heap) или на стеке (stack), - принимает компилятор на этапе анализа escape-анализа (escape analysis). Это не определяется явно программистом.

Основные правила:

  • Стек: переменные, которые не "убегают" (escape) за пределы функции, где объявлены. Например, локальные переменные, адрес которых не передаётся в другие функции и не возвращается.

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

Примеры:

GO
func foo() *int {
x := 42 // x убегает в кучу, так как возвращается указатель
return &x
}
func bar() int {
y := 10 // y остаётся на стеке
return y
}

Важные нюансы:

  • Даже большие структуры могут оставаться на стеке, если не убегают.

  • Срезы (slices) - сам заголовок (указатель на массив, длина, ёмкость) может быть на стеке, но базовый массив часто в куче, если размер не известен на этапе компиляции.

  • Компилятор Go (gc) активно оптимизирует, перемещая переменные из кучи в стек, если это безопасно.

Проверка: используйте флаг -gcflags="-m" при сборке, чтобы увидеть решения компилятора:

BASH
go build -gcflags="-m" main.go

Итог: не полагайтесь на интуицию - доверяйте escape-анализу. Go спроектирован так, чтобы минимизировать ручное управление памятью.

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

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