Может ли простаивающая горутина взять задачи у другой горутины

«Может ли простаивающая горутина взять задачи у другой горутины» — вопрос из категории Golang, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В 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)
}

Здесь планировщик будет переключаться между горутинами, но каждая выполняет свою независимую работу. Нет механизма явной передачи задач между горутинами - это нужно реализовывать через каналы или другие примитивы синхронизации.