Как вы перебираете все значения, созданные функцией? - PullRequest
1 голос
/ 29 сентября 2011

Я новичок в работе, и я обнаружил, что пишу несколько циклов 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)
}

, но сейчас я был бы рад узнать, есть ли более чистый способ перебора выходных данных таких функций в go.В частности, есть ли хороший способ избавиться от этого назойливого дублирования в операторе init и операторе post оператора for?

Ответы [ 2 ]

2 голосов
/ 29 сентября 2011

Не думаю, что есть что-то более чистое, чем то, что вы ищете.Идиоматический способ написать это:

for {
    element, err := producer.Produce()
    if err != nil {
        break
    }
    process(element)
}
0 голосов
/ 30 сентября 2011

Вот способ создать канал из такого метода:

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)
}
...