Этот вопрос проверяет знание управления стеком при рекурсивном и обычном вызове функций.
При вызове функции Go выделяет новый фрейм в стеке текущей горутины, в котором хранятся её параметры, локальные переменные и адрес возврата. При возврате фрейм очищается, стек «схлопывается». Go позволяет стеку автоматически расти и сжиматься по мере необходимости.
Frame allocation:
Новый фрейм добавляется к вершине стека горутины.
Содержимое фрейма:
Параметры, локальные переменные, return address.
Grow/Shrink:
Go-стек начинается с небольшого размера (~2 кБ) и динамически растёт вдвое при переполнении, а потом уменьшается.
Сплит-стек:
При переполнении происходит сплит: копирование частей в новый, больший стек.
Пример:
При рекурсии глубиной 1000 создаются 1000 фреймов, пока не дойдёт до ограничения и стек не увеличится.