Горутина — легковесный поток выполнения, управляемый рантаймом Go а не ОС. Начинает с ~2-8KB стека который растёт динамически.
Создаётся через go func(). Переключение между горутинами дешевле чем между потоками ОС — нет системного вызова.
Планировщик Go (GMP модель) мультиплексирует тысячи горутин на несколько потоков ОС. Количество потоков = GOMAXPROCS (обычно кол-во ядер).
Горутина блокируется на I/O или канале — планировщик переключает поток на другую горутину. Поэтому можно спокойно создавать тысячи горутин без проблем.