Какой стек в горутине: статический или динамический

«Какой стек в горутине: статический или динамический» — вопрос из категории Golang, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Go каждая горутина имеет динамический стек, который начинается с небольшого размера (обычно 2 КБ) и автоматически расширяется/сжимается по мере необходимости. Это позволяет эффективно использовать память и поддерживать миллионы горутин.

func main() {
    for i := 0; i < 1_000_000; i++ {
        go func() {
            time.Sleep(time.Second)
        }()
    }
    time.Sleep(2 * time.Second)
}

Особенности:

  • Начальный размер стека настраивается через runtime.StackMin
  • При нехватке памяти стек копируется в новый участок с увеличенным размером
  • Нет риска переполнения стека из-за рекурсии (но есть ограничение на глубину)