Skip to content

Instantly share code, notes, and snippets.

@toashd
Created October 17, 2015 09:42
Show Gist options
  • Save toashd/7b6278a737f58873814e to your computer and use it in GitHub Desktop.
Save toashd/7b6278a737f58873814e to your computer and use it in GitHub Desktop.
Go generator example
package main
import (
"fmt"
"time"
)
type generator struct {
generateNext chan struct{}
sendCh chan int
i int
}
func NewGenerator() *generator {
generateNext := make(chan struct{})
sendCh := make(chan int)
go func() {
i := 0
for {
i++ // the generation logic
if _, ok := <-generateNext; !ok {
break
}
if i == 10 {
close(sendCh)
break
}
sendCh <- i
}
fmt.Println("finished!", i)
}()
return &generator{
generateNext: generateNext,
sendCh: sendCh,
}
}
func (g *generator) Next() bool {
g.generateNext <- struct{}{}
i, ok := <-g.sendCh
g.i = i
return ok
}
func (g *generator) Scan() int {
return g.i
}
func (g *generator) Close() {
close(g.generateNext)
}
func main() {
g := NewGenerator()
for g.Next() {
i := g.Scan()
fmt.Println(i)
}
fmt.Println("now with stop")
g = NewGenerator()
for g.Next() {
i := g.Scan()
fmt.Println(i)
if i == 3 {
g.Close()
break
}
}
time.Sleep(1)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment