python和nodejs都可以是使用yield关键字,实现一个generator。
- python版:
def generator():
n = 0
while True:
yield n
n = n+1
for i in generator():
if i < 10:
print(i)
else:
break
- nodejs版
function *generator() {
let n = 0
while(true) {
yield n
n = n+1
}
}
for (i of generator()) {
if (i < 10) {
console.log(i)
}else {
break
}
}
但是golang没有yield关键字,如何实现使用golang实现一个类似上面的generator呢?
可以使用channel 配合gorotine来实现:
package main
import "fmt"
func generator() chan int {
c := make(chan int)
n := 0
go func() {
for {
c <- n
n = n + 1
}
}()
return c
}
func main() {
for i := range generator() {
if i == 5 {
break
}
fmt.Println(i)
}
}
generator 直接返回了一个channel c
,这个channel c
使用一个旁路(goroutine)在一旁一直尝试往里面放数值。如果不能放,这个 goroutine阻塞等待。在main函数中,使用range从channel c
中取值。