Ответ
Горутина в Go — это лёгкий поток выполнения, управляемый рантаймом Go, а не операционной системой. Горутины запускаются ключевым словом go и позволяют выполнять функции конкурентно. Они очень дёшевы: начальный размер стека всего ~2 КБ, поэтому можно запускать сотни тысяч горутин одновременно.
Пример:
func say(s string) {
for i := 0; i < 3; i++ {
time.Sleep(100 * time.Millisecond)
fmt.Println(s)
}
}
func main() {
go say("мир") // выполняется в отдельной горутине
say("привет") // выполняется в main-горутине
}
Ключевые особенности:
- Горутины легче потоков ОС — рантайм мультиплексирует их на потоки по модели M:N
- Переключение контекста происходит в user-space, без обращения к ядру
main— тоже горутина: когда она завершается, программа останавливается, не дожидаясь остальных- Для синхронизации используют
sync.WaitGroup, для обмена данными — каналы (chan) - Философия Go: «Не общайтесь, разделяя память; разделяйте память, общаясь» — предпочитайте каналы общим переменным