Go语言 之关闭channel

时间:2021-04-07 05:10:17
package main

import (
    "fmt"
)

func main() {
    //无缓冲,将会阻塞在接收数据
    c := make(chan int)
    go func() {
        for i := 0; i < 5; i++ {
            c <- i
        }
        //把 close(c) 注释掉,程序会一直阻塞在 if data, ok := <-c; ok 那一行
        close(c)
    }()

    for {
        //ok为true说明channel没有关闭,为false说明管道已经关闭
        if data, ok := <-c; ok {
            fmt.Println(data)
        } else {
            break
        }
    }

    fmt.Println("Finished")
}

如果发送者知道,没有更多的值需要发送到channel的话,那么让接收者也能及时知道没有多余的值可接收将是有用的,因为接收者可以停止不必要的接收等待。这可以通过内置的close函数来关闭channel实现。

注意:

l channel不像文件一样需要经常去关闭,只有当你确实没有任何发送数据了,或者你想显式的结束range循环之类的,才去关闭channel;

l 关闭channel后,无法向channel 再发送数据(引发 panic 错误后导致接收立即返回零值);

l 关闭channel后,可以继续从channel接收数据;

l 对于nil channel,无论收发都会被阻塞。