select позволяет горутине ожидать несколько операций с каналами одновременно. Он блокируется, пока один из case не станет готов к выполнению. Если готовы несколько — выбирается случайный.
select {
case msg := <-ch1:
fmt.Println(msg)
case ch2 <- 42:
fmt.Println("sent")
case <-time.After(5 * time.Second):
fmt.Println("timeout")
}
Часто используется для таймаутов, отмены через context.Done() и мультиплексирования каналов. Без default блокирует горутину до готовности одного из case.