generators


Node.js

  1. function *generator() {
  2. yield 'hello'
  3. yield 'world'
  4. }
  5. let gen = generator()
  6. while (true) {
  7. let { value, done } = gen.next()
  8. console.log(value, done)
  9. if (done) {
  10. break
  11. }
  12. }
  13. // alternatively
  14. for (let value of generator()) {
  15. console.log(value)
  16. }

Output

  1. hello false
  2. world false
  3. undefined true
  4. hello
  5. world

Go

  1. package main
  2. import "fmt"
  3. func Generator() chan string {
  4. c := make(chan string)
  5. go func() {
  6. c <- "hello"
  7. c <- "world"
  8. close(c)
  9. }()
  10. return c
  11. }
  12. func GeneratorFunc() func() (string, bool) {
  13. s := []string{"hello", "world"}
  14. i := -1
  15. return func() (string, bool) {
  16. i++
  17. if i >= len(s) {
  18. return "", false
  19. }
  20. return s[i], true
  21. }
  22. }
  23. func main() {
  24. gen := Generator()
  25. for {
  26. value, more := <-gen
  27. fmt.Println(value, more)
  28. if !more {
  29. break
  30. }
  31. }
  32. // alternatively
  33. for value := range Generator() {
  34. fmt.Println(value)
  35. }
  36. // alternatively
  37. genfn := GeneratorFunc()
  38. for {
  39. value, more := genfn()
  40. fmt.Println(value, more)
  41. if !more {
  42. break
  43. }
  44. }
  45. }

Output

  1. hello true
  2. world true
  3. false
  4. hello
  5. world
  6. hello true
  7. world true
  8. false