Переменная может быть выделена как в стеке горутины, так и в куче. Это определяется с помощью механизма escape analysis (анализа утечек) компилятора Go.
Основные принципы escape analysis:
Пример выделения в стеке:
go
Пример выделения в куче:
go
Escape analysis происходит во время компиляции. Его можно проверить, используя флаг -gcflags "-m":
bash
Вывод компилятора покажет, какие переменные "escape to heap".
Таким образом, местоположение переменной (стек vs куча) определяется не тем, что переменная выделяется в горутине, а тем, как компилятор Go анализирует ее жизненный цикл и области видимости.