ホームページ >バックエンド開発 >Golang >送信されたすべての値がバッファリングされた後、クローズされた Go チャネルから値を取得できますか?

送信されたすべての値がバッファリングされた後、クローズされた Go チャネルから値を取得できますか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-07 00:13:10847ブラウズ

Can Values Be Retrieved from a Closed Go Channel After All Sent Values Have Been Buffered?

閉じたチャネルからの値の取得

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。