Go by Example: 非ブロックチャネル操作

基本的なチャネルへの送受信はブロックしています。しかし、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を実施できます。この例では、messagessignalsの両方の非ブロック受信を試行します。

    select {
    case msg := <-messages:
        fmt.Println("received message", msg)
    case sig := <-signals:
        fmt.Println("received signal", sig)
    default:
        fmt.Println("no activity")
    }
}
$ go run non-blocking-channel-operations.go 
no message received
no message sent
no activity

次の例: チャネルのクローズ