Ответ
Переключение горутин в Go происходит в точках, где горутина добровольно уступает контроль. Это случается при:
- Вызове
runtime.Gosched() - Операциях с каналами (чтение/запись)
- Системных вызовах (например, I/O)
- Вызове
time.Sleep() - В конце выполнения горутины
Планировщик Go не вытесняет горутины насильно (как в ОС), а полагается на кооперативную многозадачность. Пример:
go func() {
fmt.Println("Горутина 1")
runtime.Gosched() // Явное переключение
fmt.Println("Горутина 1 продолжает")
}()
Важно: горутины не привязаны к потокам ОС и могут переключаться между ними.