バッファリングされたチャネルがいっぱいかどうかを確認する方法
Go では、バッファリングされたチャネルにデータを保存できる容量は限られています。チャネルがいっぱいの場合、チャネルにデータを送信すると送信者がブロックされます。ただし、ブロックするのではなくデータをドロップしたい場合、チャネルがいっぱいかどうかをどのように判断できますか?
Select ステートメントを使用した解決策
バッファされたチャネルがいっぱいの場合は、デフォルトのケースで select ステートメントを使用します。フルチャネルにデータを送信するなど、どのケースも実行できない場合は、デフォルトのケースが実行されます。
package main import "fmt" func main() { ch := make(chan int, 1) // Fill it up ch <- 1 select { case ch <- 2: // Put 2 in the channel unless it is full default: fmt.Println("Channel full. Discarding value") } }
出力:
Channel full. Discarding value
このコードは、サイズ 1 のバッファリングされたチャネルを作成し、それを埋める値を送信します。次に、select ステートメントは別の値をチャネルに送信しようとします。チャネルがいっぱいの場合は、デフォルトのケースが実行され、メッセージが出力されて値が破棄されます。
送信せずにチェック
あるいは、要素の数をチェックすることもできます。 len(ch) を使用してチャネルにキューに入れられます。これにより、データを送信しようとせずにチャネルがいっぱいかどうかを判断できます。
if len(ch) == cap(ch) { // Channel was full, but might not be by now } else { // Channel wasn't full, but might be by now }
ただし、同時データ フローにより、if ブロックに入るまでに比較の結果が無効になる可能性があることに注意してください。 .
以上がGo バッファリングされたチャネルがいっぱいかどうかを効率的に確認するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。