Гарантируется ли порядок чтения в select

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

Ответ

Нет, порядок выполнения case-блоков в select не гарантируется. Если несколько case-ов готовы к выполнению одновременно, Go выбирает один из них псевдо-случайным образом (не FIFO). Это сделано для предотвращения голодания (starvation).

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

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

select {
case <-ch1:
    fmt.Println("Received from ch1")
case <-ch2:
    fmt.Println("Received from ch2")
}

Вывод может быть любым, даже если ch1 был заполнен первым. Для приоритизации используйте вложенные select-ы с default.