|
Стандартные отправители и получатели в каналах
являются блокирующими.Тем не менее, мы можем
использовать select с выбором по умолчанию для
реализации неблокирующих отправителей, получателей
и даже неблокирующего множественного select‘а.
|
|
|
|

|
|
|
|
|
|
func main() {
messages := make(chan string)
signals := make(chan bool)
|
|
Вот неблокирующее получение. Если значение
доступно в messages, тогда select выберет
<-messages с этим значением. Если нет, он
сразу же примет случай по-умолчанию.
|
select {
case msg := <-messages:
fmt.Println("received message", msg)
default:
fmt.Println("no message received")
}
|
|
Неблокирующая отправка работает аналогично.
Здесь msg не может быть отправлено в канал
messages, потому что у канала нет буфера и
нет получателя. Поэтому выбирается действие
по-умолчанию.
|
msg := "hi"
select {
case messages <- msg:
fmt.Println("sent message", msg)
default:
fmt.Println("no message sent")
}
|
|
Мы можем использовать несколько case‘ов перед
действием по-умолчанию для реализации
многоцелевого неблокирующего выбора. Здесь мы
пытаемся получить неблокирующее получение
messages и signals.
|
select {
case msg := <-messages:
fmt.Println("received message", msg)
case sig := <-signals:
fmt.Println("received signal", sig)
default:
fmt.Println("no activity")
}
}
|