这是Golang的一个示例代码。但无法理解为什么在这种情况下需要“完成”通道。
https://gobyexample.com/closing-channels
没有理由将真消息发送到to频道。我们可以知道,当“发送所有作业”消息被打印出来时,作业通道就被完成了,不是吗?
我删除了相对于to通道和结果仍然相同的代码。
发布于 2018-01-06 22:14:53
我认为被接受的答案并没有说明确切的原因。
go语言属于过程范式,意味着每一条指令都是线性执行的。当一个go例程从主go例程中分叉时,它就开始了它自己的小冒险,留下主线程返回。
缓冲通道的容量为5,这意味着在缓冲区满之前它不会阻塞。如果它是空的,它也会阻塞(容量为零的信道本身是无缓冲的)。
因为只有4次迭代(0到<=3),所以读取操作不会阻塞。
通过指示主线程从完成的通道读取,我们强迫主线程等待,直到完成通道中有一些数据被消耗。当迭代结束时,执行of分支,而写入操作done <- true
将导致主线程中的<- done
读取操作的释放。读取操作等待从done
中提取现在插入的值。
从done
读取之后,主Go例程不再被阻塞,因此成功终止。
https://stackoverflow.com/questions/39886840
复制相似问题