mirror of
https://github.com/tmrts/go-patterns.git
synced 2025-02-23 07:33:20 +03:00
45 lines
584 B
Go
45 lines
584 B
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
)
|
|
|
|
//implement generator by closure
|
|
func FibnacciClosure() func() (ret int) {
|
|
a, b := 0, 1
|
|
return func() (ret int) {
|
|
ret = b
|
|
a, b = b, a+b
|
|
return
|
|
}
|
|
}
|
|
|
|
//implement generator by channel
|
|
func FibnacciChan(n int) chan int {
|
|
ret := make(chan int)
|
|
|
|
go func() {
|
|
a, b := 0, 1
|
|
for i := 0; i < n; i++ {
|
|
ret <- b
|
|
a, b = b, a+b
|
|
}
|
|
close(ret)
|
|
}()
|
|
|
|
return ret
|
|
}
|
|
|
|
func main() {
|
|
//closure
|
|
nextFib := FibnacciClosure()
|
|
for i := 0; i < 20; i++ {
|
|
fmt.Println(nextFib())
|
|
}
|
|
|
|
//channel
|
|
for i := range FibnacciChan(20) {
|
|
fmt.Println(i)
|
|
}
|
|
}
|