バッファリングされたチャネルがいっぱいになったことを検出する方法
バッファリングされたチャネルを扱う場合、チャネルがいつその容量に達したかを知ることが重要です。デフォルトでは、バッファーがいっぱいになったチャネルに書き込もうとするとブロックが発生します。ただし、特定のシナリオでは、代わりに項目を破棄した方が便利です。
デフォルトでの 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") } }
この例では、チャネルがすでにいっぱいの場合、デフォルトのケースが実行され、値が破棄されたことを示すメッセージが出力されます。
送信せずにチェックする
別のアプローチは、 len(ch)関数。チャネルの容量を与える cap(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 }
ただし、この方法では不正確な情報が提供される可能性があることに注意することが重要です。特にゴルーチンでチャネルにアクセスしている場合、チャネルの非同期の性質による結果が生じます。
以上がGo でフルバッファリングされたチャネルを検出して処理する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。