在某些情况下,您需要关闭频道,有些情况则不需要.
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)
由于range关键字的使用,需要关闭通道的第一个示例.当范围与通道一起使用时,它将继续尝试从通道读取,直到通道关闭.
来自http://golang.org/ref/spec#For_statements
[当
range用于] ...通道时,产生的迭代值是在通道上发送的连续值,直到通道关闭.如果通道为nil,则范围表达式将永久阻塞.
这意味着您必须关闭通道以退出循环.
在第二个示例中,您正在使用接收运算符<-.此操作员将阻止,直到可以从通道中拉出一个项目.由于有一个项目在通道中等待交付,它将立即产生.在这种情况下,close是可选的,因为之后通道上没有其他阻塞操作,因此保持"开放"状态同样乐观.
有关详细信息,请参阅频道部分 ...
| 归档时间: |
|
| 查看次数: |
144 次 |
| 最近记录: |