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

Ответ

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

Это делает select неблокирующим. Если бы блока default не было, select заблокировал бы выполнение горутины до тех пор, пока одна из операций с каналами не стала бы доступной.

Основные сценарии использования default:

1. Неблокирующее чтение из канала

Попытка прочитать данные из канала, не останавливая выполнение, если данных там нет.

ch := make(chan string)

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

2. Неблокирующая отправка в канал

Попытка отправить данные в канал, особенно в буферизованный, если он уже заполнен.

// Канал с буфером на 1 элемент
ch := make(chan int, 1)
ch <- 1 // Заполняем буфер

select {
case ch <- 2: // Эта операция заблокировалась бы
    fmt.Println("Удалось отправить 2")
default:
    // Этот блок выполнится, так как канал полон
    fmt.Println("Не удалось отправить 2, канал полон.")
}

3. Проверка состояния горутины

default позволяет горутине пробовать выполнить операцию с каналом, но при неудаче продолжать выполнять другую полезную работу в цикле, не блокируясь.