【发布时间】:2018-02-05 11:35:56
【问题描述】:
我是 Go 新手。在下面的示例中,多个 go 例程正在从无缓冲的通道中消耗。
代码:
var c = make(chan int)
func f() {
for val := range c {
fmt.Printf("routine 1 : %v\n", val)
}
}
func g() {
fmt.Printf("routine 2 : %v\n", <-c)
}
func main() {
go f()
go g()
c <- 0
c <- 1
c <- 2
c <- 3
c <- 4
c <- 5
close(c)
}
输出是:
routine 1 : 0
routine 1 : 2
routine 2 : 1
routine 1 : 3
routine 1 : 4
这里缺少值 5 并且永远不会被打印出来!为什么会这样?如果我删除呼叫 - go g(),它会完美运行。
另外,如果我让通道缓冲,说:
var c = make(chan int, 10)
根本没有输出。我知道对于无缓冲的通道,发送在接收完成后完成,而缓冲的情况并非如此。不过,对于缓冲的情况,如果 channel 还没有发送任何 int,那么考虑到它是 nil 通道,for 循环不会被阻塞吗?
请帮助解决我的两个问题。感谢所有的投入。
【问题讨论】:
-
它没有丢失,只是您没有时间使用它:程序在那一刻退出了。另外:play.golang.org/p/6fKTsbMncK