> Является ли select блокирующей конструкцией в Go (Go)

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

Компании: VK

Стек: Go

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

Да, select в Go является блокирующей конструкцией. Он приостанавливает выполнение горутины до тех пор, пока один из его case-ов не будет готов к выполнению (т.е. пока не появится возможность чтения или записи в один из каналов). Если ни один канал не готов, горутина блокируется на неопределённое время.

Однако есть способ сделать select неблокирующим - использовать default case. Если default присутствует, то при отсутствии готовых каналов выполняется он, и горутина не блокируется. Пример:

GO
select {
case msg := <-ch:
fmt.Println("Получено:", msg)
default:
fmt.Println("Нет данных")
}

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

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

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