为什么go func() { done <- true }()要放在for 循环内,而不是for循环外?
来源:11-2 使用Channel等待任务结束

Dylan_liang
2020-04-26
func Dowork(id int, c chan int, done chan bool) { // goroutine
for n := range c {
fmt.Printf("Worker %d received %v\n", id, n)
go func() { done <- true }()
}
按课程的代码,range c 中c channel应该接收到两个值,‘a’ + i 和’A’ + i , 但为什么要发两次true到done channel?如果我把go func() { done <- true }()写在for循环外,那课程中等待所有协程结束的代码是不是可以改成只传一次done了,如下
for _, worker := range workers {
<-worker.done // 课程代码是发两次worker.done的
}
写回答
1回答
-
ccmouse
2020-04-26
这主要取决于我给WaitGroup增加了多少"任务"数量。我这里认为'a','A'是两个任务,所以有Add(20),那么后面也要20个done,必须配套。
我们也可以认为它们是一个任务,Add(10),那么只要10个done就可以00
相似问题