Локальные переменные обычно на стеке; при "уходе" за пределы функции (возврат указателя, замыкание, сохранение в глобальной переменной) компилятор делает escape - выделение на куче. Escape analysis: go build -gcflags="-m" показывает, что уходит на кучу. Цель - минимизировать аллокации на куче для снижения нагрузки на GC. Указатели на стеке не должны сохраняться после возврата.
// escape: return &x
// no escape: return x