首页 >后端开发 >Golang >发送的值全部缓冲后,是否可以从关闭的 Go Channel 中检索值?

发送的值全部缓冲后,是否可以从关闭的 Go Channel 中检索值?

Patricia Arquette
Patricia Arquette原创
2024-12-07 00:13:10861浏览

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