> Как выбирается канал при нескольких готовых сообщениях в select в Go (Go)

Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы

Компании: Ozon

Стек: Go

> Пример ответа

В Go при использовании select с несколькими готовыми каналами выбор происходит псевдослучайным образом. Это означает, что если два или более канала одновременно готовы к чтению/записи, среда выполнения Go выбирает один из них случайным образом, без какого-либо приоритета или порядка.

Пример:

GO
ch1 := make(chan int, 1)
ch2 := make(chan int, 1)
ch1 <- 1
ch2 <- 2
select {
case v := <-ch1:
fmt.Println("ch1:", v)
case v := <-ch2:
fmt.Println("ch2:", v)
}

В этом коде может быть выведено как "ch1: 1", так и "ch2: 2" - результат недетерминирован.

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

Важно: если ни один канал не готов, select блокируется до появления готовности (если нет default). При наличии default выполняется он.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью