是否可以使用for循环遍历golang中返回的函数?

时间:2016-02-25 14:55:30

标签: go

说我们有这个:

func foo() func() int {
    return func() {
        for i := range [0..10] {
            return i
        }
    }
}

func main() {
    for i := foo() {

    }
}

我是否可以在for循环中迭代返回的函数,而不知道它将循环多少次?

2 个答案:

答案 0 :(得分:4)

例如,

package main

import "fmt"

func foo(n int) func() (int, bool) {
    i := -1
    return func() (int, bool) {
        if i >= n {
            return 0, true
        }
        i++
        return i, false
    }
}

func main() {
    f := foo(5)
    for i, eof := f(); !eof; i, eof = f() {
        fmt.Println(i)
    }
}

输出:

0
1
2
3
4
5

答案 1 :(得分:1)

你不能单独迭代一个函数。函数只返回一次,因此for循环永远不会循环。如果你想在i之上返回一个闭包,你可以在每次调用时增加它,但你仍然需要一种方法来知道何时停止,你可以通过从内部函数返回多个值来做。

Go还使用频道进行通信,您可以range结束。

func foo() chan string {
    ch := make(chan string)
    go func() {
        for i := 0; i < 10; i++ {
            ch <- strconv.Itoa(i)
        }
        close(ch)
    }()
    return ch
}

func main() {
    for i := range foo() {
        fmt.Println(i)
    }
}

http://play.golang.org/p/oiFTAgyeJd