Go by Example: Non-Blocking Channel Operations
阿新 • • 發佈:2020-11-16
原文: https://gobyexample.com/non-blocking-channel-operations
Basic sends and receives on channels are blocking. However, we can useselect
with adefault
clause to implementnon-blockingsends, receives, and even non-blocking multi-wayselect
s.
Here’s a non-blocking receive. If a value is available onmessages
select
will take the<-messages
case
with that value. If not it will immediately take thedefault
case
A non-blocking send works similarly. Heremsg
cannot be sent to themessages
channel, because the channel has no buffer and there is no receiver. Therefore thedefault
case is selected.
We can use multiplecase
default
clause to implement a multi-way non-blocking select. Here we attempt non-blocking receives on bothmessages
andsignals
.package main import "fmt" func main() { messages := make(chan string) signals := make(chan bool) 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") } select { case msg := <-messages: fmt.Println("received message", msg) case sig := <-signals: fmt.Println("received signal", sig) default: fmt.Println("no activity") } }