Горутина — это легковесный поток выполнения, управляемый средой выполнения Go (runtime). Они мультиплексируются на меньшем количестве системных потоков (тредпул).
Главные компоненты:
- Стек: Каждая горутина имеет отдельный, расширяемый стек. Изначально небольшой (16KB с Go 1.4+, ранее 8KB), он может увеличиваться или уменьшаться по мере необходимости.
- Планировщик Go: Реализует модель M:N (M горутин на N системных потоков). Он отвечает за переключение горутин на доступных системных потоках. Переключение происходит при блокирующих операциях (ввод/вывод, ожидание на канале) или явном вызове
runtime.Gosched().
- Контекст: Содержит указатель на машинный код для выполнения, указатель стека и другую метаинформацию, необходимую планировщику.
Начальный размер стека горутины с Go 1.4 составляет 16KB. Этот размер не фиксирован и может динамически изменяться.