func f() *int { x := 42; return &x }?Переменная x будет размещена в куче (heap), потому что её адрес возвращается из функции и переживает вызов.
Компилятор Go выполняет анализ побега (escape analysis): если на переменную ссылаются после выхода из функции, она не может жить на стеке и аллоцируется в куче. Здесь &x возвращается - значит, x уходит в кучу.
func f() *int {
x := 42
return &x // x "убегает" в кучу
}
// Проверка: go build -gcflags="-m" покажет "moved to heap"
Аллокации в куче создают работу для GC. В горячем пути часто стараются не возвращать указатели на локальные переменные или не хранить их в глобальных структурах, чтобы данные оставались на стеке.