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

For loop 如何迭代函数生成的所有值?,for-loop,go,dry,For Loop,Go,Dry,我是新手,我发现自己为循环编写了一些,如下所示: for element, err := producer.Produce(); err == nil; element, err = producer.Produce() { process(element) } 其中producer.product()是类似于reader.ReadString('\n')或fmt.Fscan(reader,&token)的函数。我更愿意写作 for element := range elements

我是新手,我发现自己为循环编写了一些
,如下所示:

for element, err := producer.Produce(); err == nil; element, err = producer.Produce() {
    process(element)
}
其中
producer.product()
是类似于
reader.ReadString('\n')
fmt.Fscan(reader,&token)
的函数。我更愿意写作

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

但就目前而言,我很乐意知道是否有一种更干净的方法来迭代go中这类函数的输出。特别是,有没有一种好方法可以消除for语句的init语句和post语句中令人讨厌的重复

我不认为有什么东西像你要找的那样干净。写作的惯用方式是:

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

下面是一种通过这种方法创建通道的方法:

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)
}
元素:=make(chan elementType)
val send func()
send=func(){
if元素,err:=producer.product();err==nil{

元素这是可行的,如果您对速度感到满意,这是非常好的。但是由于频道的原因,它比我的答案慢了一点。根据经验,这种代码非常糟糕。它降低了代码的速度,但除了稍微漂亮的
for
循环之外,它没有提供任何优势。