default в select делает его неблокирующим. Если ни один case не готов — выполняется default вместо блокировки.
// Неблокирующее чтение
select {
case msg := <-ch:
fmt.Println(msg)
default:
fmt.Println("канал пуст")
}
// Неблокирующая отправка
select {
case ch <- 42:
fmt.Println("sent")
default:
fmt.Println("канал полон, пропускаем")
}
Часто используется для: проверки канала без блокировки, busy-wait loop (осторожно с CPU), try-lock паттерна. Без default select блокирует горутину до готовности одного из case.