我正在经历Go Tour,这段代码真的融化了我的思想:
package main
import "fmt"
func fibonacci(c, quit chan int) {
x, y := 0, 1
for {
select {
case c <- x:
x, y = y, x+y
case <-quit:
fmt.Println("quit")
return
}
}
}
func main() {
c := make(chan int)
quit := make(chan int)
go func() {
for i := 0; i < 5; i++ {
fmt.Println(<-c)
}
// quit <- 0 // Suppose I remove this line (note that it is present in the Tour)
}()
fibonacci(c, quit)
}
现在我得到一个致命的错误,告诉我所有的goroutine都处于睡眠状态,所以我假设开放通道阻止程序返回和退出。
问题是,为什么这会导致错误?程序结束了,通道有读取器,并且没有更多的代码语句要执行,那么这里到底发生了什么呢?c
P.S 如果通道从未评估为 True,这是否意味着第一个情况将永远循环?quit
慕哥6287543
相关分类