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
循环之外,它没有提供任何优势。