Ответ
В Go select выбирает случайный готовый к выполнению case, если их несколько. Это предотвращает голодание (starvation) — ситуацию, когда одни каналы постоянно проигрывают другим.
Пример:
ch1 := make(chan int)
ch2 := make(chan int)
go func() { ch1 <- 1 }()
go func() { ch2 <- 2 }()
select {
case v := <-ch1:
fmt.Println("Received from ch1:", v)
case v := <-ch2:
fmt.Println("Received from ch2:", v)
}
Здесь select может выбрать любой case, так как оба канала готовы. Если бы порядок был фиксированным (например, всегда ch1), это могло бы привести к проблемам в конкурентных сценариях.
Если ни один канал не готов, select блокируется, пока хотя бы один case не станет доступным (если нет default).