1 回答

TA贡献1815条经验 获得超13个赞
有几个问题。
第一个是程序在将它们作为参数传递时复制等待组值。复制时等待组不能正常工作。而是将指针传递给等待组。
第二个问题是 main 在从通道接收值之前等待所有 goroutines 完成。因为通道的缓冲区不够大,无法容纳所有发送的值,所以程序会死锁。
第三个问题是通道上方的主要范围,但没有任何东西关闭通道。Main 不会因此退出。
要解决第二个和第三个问题,请启动另一个 goroutine 等待doSomthings 并在完成后关闭通道。
尝试这个:
func doSomething(ch chan string, wg *sync.WaitGroup) {
defer wg.Done()
ch <- fmt.Sprintf("doSomething: %d", i)
i++
if i == 10 {
return
}
wg.Add(1)
go doSomething(ch, wg)
}
func main() {
ch := make(chan string)
var wg sync.WaitGroup
wg.Add(1)
go doSomething(ch, &wg)
go func() {
wg.Wait()
close(ch)
}()
for s := range ch {
fmt.Println(s)
}
}
- 1 回答
- 0 关注
- 108 浏览
添加回答
举报