Можно ли вручную определить порядок исполнения горутин в Select

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

Ответ

Нет, порядок выполнения горутин в select не гарантируется и не может быть задан вручную. select выбирает случайный готовый к выполнению case из тех, что могут быть выполнены. Если несколько case готовы одновременно, выбор между ними псевдослучаен.

ch1 := make(chan int)
ch2 := make(chan int)

go func() { ch1 <- 1 }()
go func() { ch2 <- 2 }()

select {
case <-ch1:
    fmt.Println("Получено из ch1")
case <-ch2:
    fmt.Println("Получено из ch2")
}

Здесь может сработать любой case, в зависимости от того, какая горутина первой отправит данные. Для приоритизации используйте отдельные select или дополнительные каналы.