Ответ
Переменные, объявленные в функции, создаются в стеке (stack memory). Стек — это область памяти, которая управляется автоматически: память выделяется при входе в функцию и освобождается при выходе из неё.
Пример:
func foo() {
x := 42 // `x` создаётся в стеке
fmt.Println(x)
} // `x` уничтожается при выходе из функции
Если переменная захватывается замыканием или передаётся по ссылке (например, через указатель или интерфейс), компилятор может переместить её в кучу (heap), чтобы она жила дольше функции.
func bar() *int {
y := 100 // `y` может быть перемещён в кучу
return &y // из-за возврата указателя
}
Вывод:
- Обычные локальные переменные → стек.
- Если переменная должна пережить функцию → куча (решает компилятор).