Ответ
В Go горутины (не потоки) имеют начальный размер стека всего 2 КБ, а не 2 МБ. Это возможно благодаря сегментированному стеку ("stack splitting"), который динамически увеличивается по мере необходимости.
Причины малого начального размера:
- Экономия памяти – тысячи горутин могут работать с минимальными накладными расходами.
- Динамический рост – стек расширяется автоматически при нехватке места.
func main() {
for i := 0; i < 100000; i++ {
go func() { // Каждая горутина стартует с ~2 КБ
time.Sleep(time.Second)
}()
}
time.Sleep(time.Second * 2)
}
В отличие от потоков ОС (где стек фиксирован и велик), Go оптимизирован для массового параллелизма.