//斐波那契数列
//1 1 2 3 5 8
//观察规律
//第一轮:前两个数是1,1,相加等于2
//第二轮:第二个数和第三个数是1,2,相加等于3
//第三轮:第三个数和第四个数是2,3,相加等于5
//第四轮:第四个数和第五个数是3,5,相加等于8
//也就是说两个数相加的和,和前面的数相加
package main
import (
"fmt"
)
//ch只写,quit只读
func fibonacci(ch chan<- int, quit <-chan bool) {
x, y := 1, 1
for {
//监听channel数据的流动
select {
case ch <- x: //往里写 。第一次写的时候是1,如果没有地方读的话,那么这里会阻塞
x, y = y, x+y //第一次是往ch写1,y的值也是1,下一次y的值就是x+y
case flag := <-quit: //读
fmt.Println("flag = ", flag)
return
}
}
}
func main() {
ch := make(chan int) //数字通道
quit := make(chan bool) //程序是否结束
//消费者,从channel读取内容
//新建协程
go func() {
for i := 0; i < 8; i++ {
num := <-ch //这里读是因为防止select那里会阻塞
fmt.Println(num)
}
//可以停止
quit <- true
}() //别忘了()
//生产者,产生数字,写入channel
fibonacci(ch, quit)
}
1
1
2
3
5
8
13
21
flag = true
上面是使用select,下面用普通函数实现
package main
import (
"fmt"
)
func Fibonacci() func() int {
a, b := 0, 1
return func() int {
a, b = b, a+b
return a
}
}
func main() {
f := Fibonacci()
fmt.Println(f())
fmt.Println(f())
fmt.Println(f())
fmt.Println(f())
fmt.Println(f())
fmt.Println(f())
fmt.Println(f())
fmt.Println(f())
fmt.Println(f())
fmt.Println(f())
}
1
1
2
3
5
8
13
21
34
55