基本的なチャネルへの送受信はブロックしています。しかし、default 句のselect を使用して、非ブロック送受信と、非ブロック多方向select さえも実施できます。
|
|
|

package main
|
|
import "fmt"
|
|
func main() {
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")
}
|
非ブロック送信は同じように動作します。この場合、チャネルにバッファーがなくレシーバーがないため、messages チャネルにmsg を送信できません。したがって、default ケースが選択されます。
|
msg := "hi"
select {
case messages <- msg:
fmt.Println("sent message", msg)
default:
fmt.Println("no message sent")
}
|
default 句より上に複数のケース を使用して、多方向非ブロックselectを実施できます。この例では、messages とsignals の両方の非ブロック受信を試行します。
|
select {
case msg := <-messages:
fmt.Println("received message", msg)
case sig := <-signals:
fmt.Println("received signal", sig)
default:
fmt.Println("no activity")
}
}
|