閉じたチャネルからの値の取得
Go では、チャネルを閉じることは、将来の値の送信がないことを示します。驚くべきことに、Go 仕様で受信操作はブロックせずにゼロ値を返す必要があると規定されている後でも、閉じたチャネルから値を取得することは可能です。
この動作を理解するためにコード例を詳しく見てみましょう:
package main import ( "fmt" "sync" "time" ) func main() { iCh := make(chan int, 99) var wg sync.WaitGroup go func() { for i := 0; i < 5; i++ { wg.Add(1) go func(i int) { defer wg.Done() iCh <- i }(i) } // Close the channel once all values are sent wg.Wait() close(iCh) }() // Sleep for 5 seconds, allowing all goroutines to complete time.Sleep(5 * time.Second) print("the channel should be closed by now\n") for i := range iCh { fmt.Printf("%v\n", i) } print("done") }
range ステートメントの前にチャネルが閉じられているにもかかわらず、値を取得して出力することができます。これは、チャネル バッファーに、以前に送信された 5 つの値が最初に含まれていたためです。
Go 仕様
Go プログラミング言語仕様では、チャネルを閉じた後、受信操作が返される必要があると規定されています。ブロックなしのゼロ値。ただし、これは、以前に送信されたすべての値を受信した後にのみ適用されます。この例では、以前に送信された 5 つの値がチャネルにバッファリングされたままなので、閉じた後でもそれらを取得できます。
デフォルトでは、make で作成されたチャネルの容量はゼロです。つまり、値の送信はブロックされます。それが受け取られるまで。この例の場合、チャネルの容量は 99 で、ブロックせずに値を送信できます。
結論
チャネルを閉じると、不在が通知されます。将来の値の送信の場合、チャネル バッファはすぐには空になりません。以前に送信された値は、チャネルが閉じている場合でも、受信操作を使用して取得できます。この動作は、受信操作によって返されるゼロ値に依存する前に、すべての値を確実に受信することの重要性を示しています。
以上が送信されたすべての値がバッファリングされた後、クローズされた Go チャネルから値を取得できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。