从一个有缓冲的 channel 里读数据,当 channel 被关闭,依然能读出有效值。只有当返回的 ok 为 false 时,读出的数据才是无效的。

    1. func main() {
    2. ch := make(chan int, 5)
    3. ch <- 18
    4. close(ch)
    5. x, ok := <-ch
    6. if ok {
    7. fmt.Println("received: ", x)
    8. }
    9. x, ok = <-ch
    10. if !ok {
    11. fmt.Println("channel closed, data invalid.")
    12. }
    13. }

    运行结果:

    1. received: 18
    2. channel closed, data invalid.

    先创建了一个有缓冲的 channel,向其发送一个元素,然后关闭此 channel。之后两次尝试从 channel 中读取数据,第一次仍然能正常读出值。第二次返回的 ok 为 false,说明 channel 已关闭,且通道里没有数据。

    具体过程可以参考“从 channel 接收数据的过程是怎样的”一节。