以下に示すように、go チャネルを学習するためのコードをいくつか書きました。 リーリー
close() 関数をコメントアウトすると、「すべての goroutine はスリープ - デッドロック!」というエラーが表示されるため、「for」ステートメントはブロックされますが、これは合理的だと思われます。
close() のコメントを解除しても、「for」ステートメントは停止しません。受信者はチャネルからデフォルト値 0 と nil を取得し、決してブロックしません。
close() を呼び出しているにもかかわらずです。受信機がブロックしたり、エラーを引き起こしたりすることはありません。
close 関数が何をするのか混乱していますが、この関数は特定の種類のデフォルト値をチャネルに送信する go ルーチンを開始し、決して停止しないのでしょうか?
okはfalseになります。だからこそ、あなたの
for は決して止まらないのです。また、条件
if !ok {break } を使用して
for ステートメントを中断する必要があります。
バッファ チャネル: サイズを指定します (
make(chan int, 1))。
バッファリングされていないチャネル: サイズを指定しませんでした (
make(chan int))
close の場合、
intchan と strchan データをチャネルに送信します。したがって、コンソールには次の結果が表示されます。
リーリー
その後、メインの goroutine がチャネルからのデータの待機中にブロックされているため、
all goroutine are sleep - Deadlock が表示されます。ちなみに、このプログラムを実行すると、コードを実行するためのメイン goroutine が開始されます。メインの goroutine が 1 つだけブロックされている場合、コードの実行を手伝ってくれる人が誰もいないことを意味します。
リーリー
コードを実行する「可能性がある」ゴルーチンがまだ存在するため、デッドロックが発生していないことがわかります。以上がgolang がチャネルを閉じてもレシーバーの goroutine はブロックしませんの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。