【发布时间】:2015-10-28 20:00:46
【问题描述】:
我是 Go 新手,所以如果我的问题的答案很明显,我提前道歉:)
我正在计划一个生产者读取文件并将每一行发送到一个频道,例如:
scanner := bufio.NewScanner(file)
for scanner.Scan() {
processingChan <- scanner.Text()
}
并添加一些 goroutine 来使用这些行。
现在,我想要的是,如果任何行无法在 goroutine 中处理(假设该行包含我的业务规则的无效值),我想停止生产者循环,关闭文件(已经延迟)和完成程序。
问题是:如何“通知”生产者循环/for 停止?
我发现有人建议:
for scanner.Scan() {
select {
case <- quit:
// break / return
default:
// send next line to channel
}
}
如果出现任何故障,消费者 goroutine 将写入“退出”(或错误)通道。
这种方法可能解决了这个问题,但我想知道是否有更清洁/更好或只是常见/流行的方法。
【问题讨论】: