【发布时间】:2019-01-02 22:44:00
【问题描述】:
我正在尝试学习 Go,我正在使用 this tutorial。
我已经写了以下代码,
var wg sync.WaitGroup
func foo(c chan int, someValue int) {
defer wg.Done()
c <- someValue * 5
}
func main() {
fooVal := make(chan int)
for i := 0; i < 10; i++ {
go foo(fooVal, i)
wg.Add(1)
}
wg.Wait() // Wait for all routines to complete
close(fooVal) // close channel
for item := range fooVal {
fmt.Println(item)
}
}
这是我目前的理解,
- 我创建了一个接收整数的通道
- 我创建了 10 个子例程,并将 1 个添加到等待组中,以便稍后同步它们
- 我等待例程完成
- 我关闭了通道,使其不再接收任何值
- 我循环遍历通道中的值以打印它们
但是,我收到一条错误消息:
fatal error: all goroutines are asleep - deadlock!
我不确定这意味着什么。我的猜测是 range 试图从通道中获取一个值,但它没有任何值。但这不应该发生,因为我等待所有例程完成,然后我关闭了频道。
发生了什么事?
对此的解决方案是执行make(chan int, 10) 之类的操作来为其提供缓冲区,但我不确定缓冲区是什么或为什么需要它。
另外,我不确定make 做了什么。我也用它来创建地图。它只是一个构造函数吗?
【问题讨论】:
-
旁白:你必须调用 wg.Add before 启动 goroutine,否则 Done 可能会在 Add 和恐慌之前被调用:play.golang.org/p/X1cK7Lcj_K4
标签: go