| チャネル上の基本的な送受信はブロックします。
しかし、default句をもったselectを使えば、
ブロックしない (non-blocking) 送信、受信、
そして多重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")
    }
 | 
        
        
          | ブロックしない多重 selectを実現するために、default句の前に複数の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")
    }
}
 |