我怎么知道关闭是必要的?

2 channel go

在某些情况下,您需要关闭频道,有些情况则不需要.

http://play.golang.org/p/piJHpZ2-aU

queue := make(chan string, 2)
queue <- "one"
queue <- "two"
close(queue)

for elem := range queue {
    fmt.Println(elem)
}
Run Code Online (Sandbox Code Playgroud)

我来了

fatal error: all goroutines are asleep - deadlock!
Run Code Online (Sandbox Code Playgroud)

而此代码的关闭是可选的

http://play.golang.org/p/Os4T_rq0_B

jobs := make(chan int, 5)
done := make(chan bool)

go func() {
    for {
        j, more := <-jobs
        if more {
            fmt.Println("received job", j)
        } else {
            fmt.Println("received all jobs")
            done <- true
            return
        }
    }
}()

for j := 1; j <= 3; j++ {
    jobs <- j
    fmt.Println("sent job", j)
}
close(jobs)
fmt.Println("sent all jobs")

<-done
// close(done)
Run Code Online (Sandbox Code Playgroud)

J. *_*mes 6

由于range关键字的使用,需要关闭通道的第一个示例.当范围与通道一起使用时,它将继续尝试从通道读取,直到通道关闭.

来自http://golang.org/ref/spec#For_statements

[当range用于] ...通道时,产生的迭代值是在通道上发送的连续值,直到通道关闭.如果通道为nil,则范围表达式将永久阻塞.

这意味着您必须关闭通道以退出循环.

在第二个示例中,您正在使用接收运算符<-.此操作员将阻止,直到可以从通道中拉出一个项目.由于有一个项目在通道中等待交付,它将立即产生.在这种情况下,close是可选的,因为之后通道上没有其他阻塞操作,因此保持"开放"状态同样乐观.

有关详细信息,请参阅频道部分 ...