|
基本的なチャネルへの送受信はブロックしています。しかし、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")
}
}
|