golang实现generator

来源:互联网 发布:谷歌娘软件下载 编辑:程序博客网 时间:2024/06/18 01:12

python和nodejs都可以是使用yield关键字,实现一个generator。

  • python版:
def generator():    n = 0    while True:        yield n        n = n+1for 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 mainimport "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中取值。

原创粉丝点击