Ответ
В Go компилятор сам решает, где хранить переменную (стек/куча) на основе escape-анализа. Разработчику обычно не нужно об этом заботиться.
Как проверить?
Используйте go build -gcflags="-m", чтобы увидеть решения компилятора:
package main
func main() {
x := 42 // Обычно в стеке
y := new(int) // Может уйти в кучу
*y = 100
_ = x
_ = y
}
Вывод -gcflags="-m" покажет, "escapes to heap" для переменных, которые компилятор решил разместить в куче.
Правило:
Если переменная "убегает" (используется за пределами функции или имеет неопределённый срок жизни), она сохраняется в кучу.