Ответ
select в Go используется для ожидания нескольких операций с каналами. Он блокирует выполнение, пока хотя бы один из каналов не будет готов к операции (чтение/запись). Если готовы несколько - выбирается случайный.
Пример:
ch1 := make(chan string)
ch2 := make(chan string)
go func() { ch1 <- "from ch1" }()
go func() { ch2 <- "from ch2" }()
select {
case msg1 := <-ch1:
fmt.Println(msg1)
case msg2 := <-ch2:
fmt.Println(msg2)
}
Ключевые особенности:
- Не требует
default(блокирующий режим) - С
defaultстановится неблокирующим - Порядок case не гарантирует приоритет
- Часто используется с
time.Afterдля таймаутов