golang实现generator

前端之家收集整理的这篇文章主要介绍了golang实现generator前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

原文链接:https://www.f2er.com/go/188278.html

猜你在找的Go相关文章