//斐波那契數列
//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