gobyexample/examples/non-blocking-channel-operations/non-blocking-channel-operations.go
2019-10-07 22:45:17 +03:00

53 lines
2.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Стандартные отправители и получатели в каналах
// являются блокирующими.Тем не менее, мы можем
// использовать `select` с выбором `по умолчанию` для
// реализации _неблокирующих_ отправителей, получателей
// и даже неблокирующего множественного `select`'а.
package main
import "fmt"
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")
}
}