说我们有这个:
func foo() func() int {
return func() {
for i := range [0..10] {
return i
}
}
}
func main() {
for i := foo() {
}
}
我是否可以在for循环中迭代返回的函数,而不知道它将循环多少次?
答案 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)
}
}