为什么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就可以

0
0

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程