Как не блокироваться навечно при чтении из пустого канала? Что такое select и его паттерны?

Ожидайте чтение через select вместе с context.Done или таймером. Default делает проверку неблокирующей, но в бесконечном цикле может создать busy loop.

Короткий ответ

Что ответить на собеседовании

Ожидайте чтение через select вместе с context.Done или таймером. Default делает проверку неблокирующей, но в бесконечном цикле может создать busy loop.

Подробный разбор

Ответ с пояснениями

Ожидайте чтение через select вместе с context.Done или таймером. Default делает проверку неблокирующей, но в бесконечном цикле может создать busy loop.

Пример отменяемого ожидания:

select {
case value, ok := <-ch:
    if !ok { return }
    use(value)
case <-ctx.Done():
    return
}

Закрытый канал готов к чтению, поэтому проверяйте ok, иначе цикл может бесконечно получать нулевые значения. Nil-канал отключает соответствующую ветку select. Для длительного ожидания задайте дедлайн контекста, а не создавайте бесконечно новые таймеры внутри горячего цикла.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее