php エディターの Youzi が、この記事でよくある質問に答えます。「なぜ Go チャネルのバッファーは書き込み/読み取りを正しく制限しないのですか?」Go 言語では、チャネルというメカニズムがあります。コルーチン間の通信用。バッファーを備えたチャネルを使用する場合、書き込みまたは読み取り操作の数を制限することでプログラムの動作を制御できることが期待されます。ただし、実際には、チャネル バッファーは書き込み/読み取り操作の数を直接制限することはできません。この問題の原因と解決策については、以下で詳しく説明します。
チャネルを使用して 2 つの go ルーチン間で通信しようとしています。まず、整数チャネルを作成し、それを 0 から 10 までの一連の数値を出力する go ルーチンにパラメータとして渡しました。これらのプログラムの出力には意味がありません。
これはメインコードです:
リーリーこのコードを実行すると、次の出力が得られました:
リーリー2 回の書き込み実行の後に 2 回の読み取り実行が続くことに注意してください。
その後、次の機能を実現するためにバッファ サイズを設定します。
リーリーその後、次の出力が得られます:
リーリー現在、5 回の書き込み実行と 5 回の読み取り実行があることに注意してください。
コードと出力を取得したら、最後の疑問が生じます。なぜこれらの実行はそのように動作するのでしょうか?まず、一度に読み書きできるのは 1 つの数字だけではないでしょうか。それ以上に、なぜ 2 回目の実行では毎回 3 つではなく 5 つの数値を読み書きするのでしょうか (これはバッファ サイズのため)。
メッセージが出力されるとき、およびチャネルから数値が読み取られるとき、またはチャネルに数値が書き込まれるとき、混乱します。
書き込みが発生した場合、「書き込み」メッセージは表示されません。これらは書き込み間のある時点で発生します。同様に、「読み取り中」メッセージは読み取り間のある時点で発生します。
最初のコード スニペットを配置する 1 つの方法を次に示します。これにより、次の出力が生成されます。
制御はこのようにメインとワーカーの間で継続的に渡され、ブロックする前にそれぞれが 2 つのメッセージを出力します。
同様に、2 番目のフラグメントは次のように配置できます:
以上がGo Channel のバッファ制限が書き込み/読み取りを正しく制限しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。