package main
import (
"fmt"
)
func fibonacci(c chan int) {
x, y := 0, 1
for {
c <- x
x, y = y, x+y
}
}
func main() {
c := make(chan int)
go func() {
for i := 0; i < 10; i++ {
fmt.Println(<-c)
}
}()
fibonacci(c)
}
之前的代碼是這樣律歼,但是每次運(yùn)行都發(fā)生死鎖。
image.png
之后發(fā)現(xiàn)Fibonacci是一個死循環(huán)制圈,如果main中間的goroutine不再需要c中的數(shù)據(jù)畔况,
Fibonacci就會一直產(chǎn)生數(shù)據(jù),直到channel溢出跷跪,所以需要給Fibonacci一個停止條件。
package main
import (
"fmt"
)
func fibonacci(c chan int, q chan bool) {
x, y := 0, 1
for {
select {
case c <- x:
x, y = y, x+y
case <-q:
fmt.Println("quit")
return
}
}
}
func main() {
c := make(chan int)
q := make(chan bool)
go func() {
for i := 0; i < 10; i++ {
fmt.Println(<-c)
}
q <- true
}()
fibonacci(c, q)
}
image.png