Ответ
Да, в Go конструкция select
может иметь ветку default
.
Она выполняется немедленно, если ни один из case
(операций с каналами) не готов к выполнению в данный момент. Основное предназначение default
— сделать select
неблокирующим.
Пример неблокирующего чтения из канала:
select {
case msg := <-ch:
fmt.Println("Получено сообщение:", msg)
default:
// Этот блок выполнится, если в канале 'ch' нет данных для чтения
fmt.Println("Сообщений нет, идем дальше.")
}
Ключевые моменты:
Блокирующий vs. Неблокирующий
select
:- Без
default
:select
будет блокировать выполнение горутины до тех пор, пока хотя бы одна из операций с каналами не станет доступной. - С
default
:select
никогда не блокируется. Он либо выполняет готовыйcase
, либо немедленно выполняетdefault
.
- Без
Выбор при нескольких готовых каналах: Если в момент проверки несколько
case
готовы к выполнению, Go выберет один из них псевдослучайным образом. Веткаdefault
будет выполнена только в том случае, если ни один изcase
не готов.