Ответ
Горутина может быть переключена в следующих случаях:
- Блокирующие операции (чтение/запись в канал, системные вызовы, I/O).
- Явный вызов
runtime.Gosched(), который добровольно отдаёт управление. - При работе с разделяемыми ресурсами (например, мьютексами), если горутина блокируется.
- По истечении кванта времени (обычно ~10 мс), если горутина не завершила работу.
Пример:
go func() {
for i := 0; i < 3; i++ {
fmt.Println(i)
runtime.Gosched() // Переключение на другую горутину
}
}()