2016-12-06 9 views
2

goで非ブロッキングチャネル操作。送信?私は<a href="https://gobyexample.com/non-blocking-channel-operations" rel="nofollow noreferrer">Go by Example: Non-Blocking Channel Operations</a>を通じてつもり

限りmessagesチャンネルでは何も存在しないので、私は、最初のselectdefaultケースをトリガされ理解し、defaultケースが存在しなかった場合、我々はfatal error: all goroutines are asleep - deadlock!を受け取ることになるとして、エラー?

まあ、私はそれが受け取ると反対に動作するはず、と思ったとして、具体的case messages <- msg:

をトリガー、私は二selectを引き起こすことができる方法を見つけ出すことはできません。したがって、2つのメッセージ用のバッファがあり、3番目のメッセージをチャネルに送信するとdefault句がトリガーされますが、messagesチャネルは空です。なぜ2番目の選択でdefault句がトリガーされるのですか?そして、どのように私はcase messages <- msg:句をトリガーできますか?

答えて

4

なぜ2番目の選択でデフォルトの節がトリガーされるのですか?

チャネルはバッファリングされておらず、受信時にブロックされている他のゴールーチンはないためです。

ケースメッセージをトリガーするにはどうすればいいですか?< - msg:clause?

あなたがいずれかを実行できます。

  1. messages

    を受けてブロックされている別の行くルーチンを作成します

    messages := make(chan string, 1) 
    

    https://play.golang.org/p/b1aO6N-dYf

  2. をバッファリングしてください

    https://play.golang.org/p/Z7e1ZcO3C5

+0

さらに質問:D うまくいけば、私はあなたに感謝し、自分でそれを把握します! – Arno

+0

@アルノ、この記事を読むhttp://stackoverflow.com/questions/18660533/why-using-unbuffered-channel-in-the-same-goroutine-gives-a-デッドロックの説明:) –

関連する問題

 関連する問題