package main
import "fmt"
// cacl_ch 只写通道, 负责将结果写入
// quit_ch 只读通道, 停止计算
func fabonacci_channel(cacl_ch chan<- int, quit_ch <-chan bool) {
x, y := 1, 1
for {
select {
case cacl_ch <- x:
x, y = y, x + y // x 是下一次的计算结果
case quit := <-quit_ch:
fmt.Println("calc quit --- ", quit)
return
}
}
}
// 闭包实现
func fabonacci_pack() func() int {
x, y := 0, 1
return func() int {
x, y = y, x + y
return x
}
}
func main() {
// 结果通道
cacl_ch := make(chan int)
// 结束信号
quit_ch := make(chan bool)
go func() {
for i := 0; i < 8; i++ {
num := <- cacl_ch
fmt.Println(num)
}
quit_ch <- true
}()
// 通道实现
fabonacci_channel(cacl_ch, quit_ch)
// 闭包实现
f := fabonacci_pack()
for i := 0; i < 8; i++ {
fmt.Println(f())
}
}