Ответ
Нет, порядок выполнения 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.