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