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