Горутины — легковесные потоки выполнения, управляемые Go runtime. Запускаются через ключевое слово go:
go func() {
fmt.Println("hello from goroutine")
}()
Горутина занимает ~2-8 KB стека (растёт динамически), обычный поток ОС — ~1-8 MB. Можно создать миллионы горутин. Go scheduler мультиплексирует горутины на потоки ОС по модели M:N.
Важно: main-горутина не ждёт остальные — нужно явно синхронизировать через каналы, WaitGroup или context.