Ответ
В 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 - При нехватке памяти стек копируется в новый участок с увеличенным размером
- Нет риска переполнения стека из-за рекурсии (но есть ограничение на глубину)