如果有一个需要生成和处理的列表(理想情况下,在生成时),那么约定是什么?似乎回调并没有被使用,而频道是普遍的最爱。无论是为每个项目调用回调还是启动goroutine来生成列表并同步读取和处理每个项目,都不会有决定性的好处。
我了解在等待列表完成或者两者都执行昂贵的任务时是否有多个任务要完成,并且可能能够在生成下一个项目时处理最后一个项目,但事实并非如此。生产者和消费者都是低成本的。
答案 0 :(得分:3)
惯例是使用回调。以下是标准库中的几个示例:filepath.Walk,ast.Walk。
具有生成器goroutine模式的通道的缺点是,当消费者在通道关闭之前不接收时,它会泄漏goroutine。另一个问题是为数据竞赛创造机会。标准库在Go的早期使用了这种模式。由于这些问题,此代码在Go 1之前被删除。