加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

golang实现generator

发布时间:2020-12-16 18:10:39 所属栏目:大数据 来源:网络整理
导读: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 )

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中取值。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读