ホームページ >バックエンド開発 >Golang >go チャネルの動作は、メッセージの送信方法に応じて変わりますか?

go チャネルの動作は、メッセージの送信方法に応じて変わりますか?

WBOY
WBOY転載
2024-02-09 10:39:20793ブラウズ

go 通道的行为是否会根据消息发送到它的方式而改变?

php エディタ Xiaoxin Go 言語では、チャネルはゴルーチン間でデータを転送するために使用されるメカニズムです。チャネルの動作は、チャネルへのメッセージの送信方法によって異なります。チャネルがバッファリングされていると宣言されると、メッセージを送信するゴルーチンはメッセージをチャネルのバッファに入れてから実行を継続します。チャネルがバッファリングされていないと宣言されている場合、メッセージを送信するゴルーチンは、他のゴルーチンがチャネルからメッセージを受信するまでブロックされます。したがって、チャネルの動作はメッセージがどのように送信されるかによって変化すると言えます。

質問の内容

これら 2 つのコードの実行が異なるのはなぜですか?

  1. 次のコードを実行すると、致命的なエラーが返されます: すべての goroutines are sleep - Deadlock! ###エラー。
  2. リーリー
    次のコードを正しく実行すると、2 と 3 (それぞれ 1 行) が返されます。
  1. リーリー
#1 は、ch がバッファリングされたチャネルとして定義されている場合にのみ正しく実行されます。なぜ?なぜchのbuffer()は文句を言わずに2つの値を受け入れるのでしょうか?

解決策

バッファリングされていないチャネルでの送信操作は、別の goroutine がそこからデータを読み取るまでブロックされます。これが、コードの最初の部分がデッドロックする理由です。チャネルに送信すると、他の goroutine はそこから読み取りません。

2 番目のケースでは、2 つの値をチャネルに送信するゴルーチンがあり、メインのゴルーチンは送信中にチャネルから 2 回読み取ります。チャネルは 2 つの送信を受け入れませんが、最初の送信操作は最初の読み取りによってブロックされず、2 番目の送信操作は 2 番目の読み取りによってブロックされません。

以上がgo チャネルの動作は、メッセージの送信方法に応じて変わりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。