Ответ
В Go планировщик (scheduler) автоматически распределяет задачи между потоками ОС (M) и горутинами (G). Если одна горутина простаивает (например, заблокирована на I/O или канале), планировщик может переключить выполнение на другую горутину, но не в смысле "передачи задач", а в смысле выделения процессорного времени.
Пример:
func worker() {
for {
// Работа
time.Sleep(time.Second) // Имитация простоя
}
}
func main() {
go worker() // Горутина 1
go worker() // Горутина 2
time.Sleep(5 * time.Second)
}
Здесь планировщик будет переключаться между горутинами, но каждая выполняет свою независимую работу. Нет механизма явной передачи задач между горутинами - это нужно реализовывать через каналы или другие примитивы синхронизации.