<- worker.done 两次的意思是什么?
来源:11-2 使用Channel等待任务结束

HuberyYoung
2020-12-24
package main
import (
"fmt"
)
type work struct {
in chan int
done chan bool
}
func doWorker(id int, w work) {
for n := range w.in {
fmt.Printf("createWorker %d received %c\n", id, n)
go func() {
w.done <- true
}()
}
}
func createWorker(id int) work {
w := work{
in: make(chan int),
done: make(chan bool),
}
go doWorker(id, w)
return w
}
func chanDemo() {
var works [10]work
for i := 0; i < 10; i++ {
works[i] = createWorker(i)
}
for i := 0; i < 10; i++ {
works[i].in <- 'a' + i
}
for i := 0; i < 10; i++ {
works[i].in <- 'A' + i
}
// 第一次执行
for _, worker := range works {
<-worker.done
<-worker.done
}
//// 第二次执行
//for _, worker := range works {
// <-worker.done
//}
}
func main() {
chanDemo()
}
如上代码,为什么for range 的时候要用两次<- worker.done?我两次执行都没有报错,只不过打印出来的值要少一些
写回答
1回答
-
俱乐部恶霸
2020-12-24
for i := 0; i < 10; i++ {
works[i].in <- 'a' + i
}
for i := 0; i < 10; i++ {
works[i].in <- 'A' + i
}上面往channel写了20次
for _, worker := range works {
<-worker.done
<-worker.done
}range workes只循环10次,所以执行两次<-worker.done才能把channel读完
00
相似问题