チャネルの動作の違いを明らかにする: make(chan bool) と make(chan bool, 1)
チャネルは不可欠な部分ですGo の同時実行モデルを利用して、ゴルーチン間の効率的な通信と同期を可能にします。ただし、チャネルの作成時に指定したバッファ サイズによっては、チャネルの動作が大幅に異なる場合があります。
バッファなしチャネル (make(chan bool))
バッファなしチャネル、次で作成されます。 make(chan bool) のバッファ サイズは 0 です。これは、常に値を保持できないことを意味します。その結果、バッファリングされていないチャネルへの読み取りまたは書き込みの試行は、通信を完了するために別の goroutine が利用可能になるまでブロックされます。
バッファリングされたチャネル (make(chan bool, 1))
make(chan bool, 1) で作成されたバッファリングされたチャネルのバッファ サイズはゼロではありません。このバッファにより、ゴルーチンは別のゴルーチンが利用可能になるのを待たずに値を送受信できるようになります。バッファは値の一時ストレージとして機能し、非同期通信を可能にします。
実践例
次のコードを考えてみましょう。
<code class="go">chanFoo := make(chan bool) for i := 0; i < 5; i++ { select { case <-chanFoo: fmt.Println("Read") case chanFoo <- true: fmt.Println("Write") default: fmt.Println("Neither") } }</code>
この中でたとえば、chanFoo はバッファリングされていないチャネルです。プログラムが実行されると、ゴルーチンはチャネルへの読み取りまたは書き込みを継続的に試行しますが、通信するゴルーチンがないためブロックされたままになります。その結果、プログラムは反復ごとに「どちらでもない」と出力します。
動作中のバッファー チャネル
次に、次の修正されたコードを考えてみましょう。
<code class="go">chanFoo := make(chan bool, 1) for i := 0; i < 5; i++ { select { case <-chanFoo: fmt.Println("Read") case chanFoo <- true: fmt.Println("Write") default: fmt.Println("Neither") } }</code>
chanFooにバッファサイズ1を追加することで非同期通信を可能にします。プログラムは「読み取り」メッセージと「書き込み」メッセージを交互に出力するようになり、別のゴルーチンが読み取りまたは書き込みの準備ができるまでバッファーが値を保存できることを示しています。
結論
Go での効率的な同時実行プログラミングには、バッファなしチャネルとバッファありチャネルの違いを理解することが重要です。バッファなしチャネルでは同期が可能ですが、バッファ付きチャネルでは非同期通信が可能です。バッファ サイズを慎重に選択すると、最適なパフォーマンスが得られ、潜在的なブロッキングやデッドロックが回避されます。
以上がGo チャネルの `make(chan bool)` と `make(chan bool, 1)` の重要な違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。