Как работает и для чего используется `default` в конструкции `select`?

Ответ

Да, в Go конструкция select может иметь ветку default.

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

Пример неблокирующего чтения из канала:

select {
case msg := <-ch:
    fmt.Println("Получено сообщение:", msg)
default:
    // Этот блок выполнится, если в канале 'ch' нет данных для чтения
    fmt.Println("Сообщений нет, идем дальше.")
}

Ключевые моменты:

  1. Блокирующий vs. Неблокирующий select:

    • Без default: select будет блокировать выполнение горутины до тех пор, пока хотя бы одна из операций с каналами не станет доступной.
    • С default: select никогда не блокируется. Он либо выполняет готовый case, либо немедленно выполняет default.

  2. Выбор при нескольких готовых каналах: Если в момент проверки несколько case готовы к выполнению, Go выберет один из них псевдослучайным образом. Ветка default будет выполнена только в том случае, если ни один из case не готов.