如何迭代函数生成的所有值?

时间:2011-09-29 00:03:18

标签: for-loop go dry

我是新手,我发现自己写了几个for循环,看起来像这样:

for element, err := producer.Produce(); err == nil; element, err = producer.Produce() {
    process(element)
}

其中producer.Produce()reader.ReadString('\n')fmt.Fscan(Reader, &token)之类的函数。我更愿意写

for element := range elements {
    process(element)
}

但是现在,我会很高兴知道是否有更简洁的方法来迭代这些函数的输出。特别是,有一种很好的方法可以摆脱init语句和for语句的post语句中的这种烦人的重复吗?

2 个答案:

答案 0 :(得分:2)

我认为没有什么比你想要的更干净了。写它的惯用方法是:

for {
    element, err := producer.Produce()
    if err != nil {
        break
    }
    process(element)
}

答案 1 :(得分:0)

以下是从这种方法创建频道的方法:

elements := make(chan elementType)

val send func()
send = func() {
    if element, err := producer.Produce(); err == nil {
        elements <- element
        go send()
    } else {
      close(elements)
    }
}
go send()

for element := range elements {
    process(element)
}