老师您好!
根据您的讲述,在这里我们之所以会阻塞,是因为我们在第一个任务(打印小写字母)完成后,没有goroutine再去接收worker.done发出的东西,所以造成阻塞。
根据您的代码,我做了两个实验:
#实验一# 我们去收整个队列中的最后一个done不就能解决这个问题了,我用-race查看之后也没有数据冲突。
#实验二# 我们去收整个队列的一次done,第二个任务(打印大写字母)发出的done就不理会了,同样也没有出现数据冲突。
代码展示:
func chanDemo() {
var workers [26]worker
for i := range workers {
workers[i] = createWorker(i)
}
for i := range workers {
workers[i].in <- 'a' + i
}
for i := range workers {
workers[i].in <- 'A' + i
}
// 实验二:
//for i := 0; i < len(workers); i++ {
// <-workers[i].done
//}
// 实验一:
<-workers[len(workers)-1].done
}