首頁 >後端開發 >Golang >傳送的值全部緩衝後,是否可以從關閉的 Go Channel 檢索值?

傳送的值全部緩衝後,是否可以從關閉的 Go Channel 檢索值?

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")
}

儘管通道在範圍語句之前關閉,我們仍然可以擷取並列印值。這是因為通道緩衝區最初包含 5 個先前傳送的值。

Go 規範

Go 程式語言規範規定,關閉通道後,接收操作應傳回零值而不阻塞。但是,這僅在收到所有先前發送的值後才適用。在我們的範例中,先前發送的 5 個值保留在通道中緩衝,即使在關閉後我們也可以檢索它們。

預設情況下,使用 make 建立的通道的容量為零,這表示傳送值會阻塞直到收到為止。在我們的範例中,通道的容量為 99,這允許在不阻塞的情況下發送值。

結論

關閉通道時表示不存在對於未來的值傳輸,它不會立即清空通道緩衝區。即使通道關閉,仍然可以使用接收操作檢索先前傳送的值。此行為證明了在依賴接收操作傳回的零值之前確保接收到所有值的重要性。

以上是傳送的值全部緩衝後,是否可以從關閉的 Go Channel 檢索值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn