Материал проходит вычитку — возможны неточности.
Урок 82 из 118

default и nil-канал в select

Сброс статистики тормозил воркеров: они стояли в очереди, пока метрики уезжали в хранилище. Миша переделал отправку — если приёмник был занят, статистика оставалась ждать до следующей попытки, а обработка файлов шла дальше. Сергей прогнал стенд и подтвердил: задержки исчезли.

Главная мысль

default делает select неблокирующим, а присваивание каналу nil выключает его ветку — так select превращается в гибкий коммутатор.

Default — неблокирующая проверка

select {
case f := <-queue:
    fmt.Println("взял файл:", f)
default:
    fmt.Println("в очереди пока пусто")
}

С default select не ждёт: если ни один case не готов, выполняется default. Это классическая неблокирующая проверка — «есть ли уже файл, и если нет, идём дальше».

Nil-канал выключает ветку

Операции на nil-канале блокируются навсегда. В select это свойство работает на нас: case с nil-каналом никогда не считается готовым, то есть просто выключен.

var paused chan struct{} // nil: ветка выключена

select {
case f := <-queue:
    // ...
case <-paused: // не сработает, пока paused — nil
    return
}

Присваивая каналу nil, можно динамически убирать ветки: например, «выключить» чтение очереди, пока конвейер переиндексируется.

Коммутатор

Вместе default и nil дают паттерн: горутина крутится в цикле, у неё есть постоянные ветки и переключаемые. Нужно временно не читать один из источников — присвоил nil; нужно неблокирующе опросить — default. Select из «ждалки» превращается в коммутатор событий конвейера.

В следующем уроке

Вы узнаете:

  • как закрытый канал ведёт себя в select
  • как идиома try-send работает через default
Задание · вопросы

Проверьте себя

Вопрос 1 из 3

Как приостановить чтение из канала, не завершая select-цикл?

Вопрос 2 из 3

Зачем default в цикле-коммутаторе с несколькими источниками?

Вопрос 3 из 3

Что даёт select с default?

Итоги

default — не ждать; nil-канал — выключенная ветка. Select — гибкий инструмент маршрутизации событий.

Наш сайт собирает куки. Чтобы тебе было удобнее им пользоваться. Нажимая на кнопку, ты даёшь разрешение собирать куки