default делает select неблокирующим. Если ни один канал не готов — выполняется default:
select {
case msg := <-ch:
fmt.Println("received", msg)
case ch <- 42:
fmt.Println("sent")
default:
fmt.Println("no channel ready")
}
Без default — select блокируется до готовности любого канала.
Типичные применения:
// Non-blocking receive
select {
case msg := <-ch:
process(msg)
default:
// канал пуст, делаем что-то другое
}
// Try-send (отбросить если буфер полон)
select {
case ch <- msg:
default:
log.Println("channel full, dropping")
}
Внимание: default в цикле с select создаёт busy loop (100% CPU). Используй ticker или time.After вместо этого.