select выбирает одну из готовых операций (отправка или приём) по нескольким каналам. Если готовы несколько - выбор псевдослучайный. Если ни одна не готова - блокируется. С default не блокируется и выполняет default.
select {
case v := <-ch1: use(v)
case ch2 <- x:
case <-done: return
default: // non-blocking
}