Go でのチャネル出力順序を理解する
指定された Go コード スニペットには、ゴルーチン間で通信するためのバッファリングされていないチャネルの使用が含まれます。コードではブロック動作のため、「hello」の後に「ping」が出力されることが想定されていますが、一貫して「ping」の後に「hello」が出力されます。これにより、メッセージがチャネルに書き込まれ、チャネルから読み取られる順序について疑問が生じます。
コードが示すように、バッファリングされていないチャネルは、データが利用可能になるまで送信者と受信者の両方をブロックします。これは、go ルーチンがチャネルに書き込もうとすると、メッセージが読み取られるまでブロックされることを意味します。
実行すると、コードは "hello" と "ping" を書き込もうとする 2 つの go ルーチンをフォークします。チャンネル。すぐに使用できるレシーバーがないため、両方のルーチンがブロックされます。
最初の読み取り操作 (msg := <-messages) が発生するとき、プログラムは待機中のゴルーチンを任意に選択しません。代わりに、すでにチャネルに書き込まれているものが選択されます。これは、「ping」が常に「hello」の前に書き込まれるため、常に msg に割り当てられる理由を説明しています。
したがって、出力されるメッセージの順序は、非決定的なゴルーチンの実行順序によって決まります。チャネルに書き込むゴルーチンに print ステートメントを追加することで、書き込みの順序がチャネルから読み取られるメッセージの順序に対応していることを確認できます。
以上がGo Unbuffered チャネルが予期しない順序でメッセージを出力するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。