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)
}
之前的代码是这样,但是每次运行都发生死锁。
image.png
之后发现Fibonacci是一个死循环,如果main中间的goroutine不再需要c中的数据,
Fibonacci就会一直产生数据,直到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
网友评论