有如下go 代码片段:
package main
import "fmt"
func fibonacci(c, quit chan int) {
x, y := 0, 1
// 不断向c中发送数据,直到quit接到退出信号
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)
// 位置 1
go func() {
// 从通道c读取10个数值
for i := 0; i < 10; i++ {
fmt.Println(<-c)
}
// 然后向quit发送退出信号
quit <- 0
}()
// 位置2
fibonacci(c, quit)
}
1. 改代码能正常执行,但是如果我把最后一行提到位置1(即放到go func匿名函数之前)就报错,为什么:
fatal error: all goroutines are asleep - deadlock!
2. 能否用通俗的语言详细解释一下具体代码执行流程(golang新手没办法。。)。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
<p>如果fibonacci先执行那么他就是一个跳不出来的死锁</p>
<p>如果 先执行fibonacci ,那么main 协程就会等待case条件:1,有读取c 2,有写入quit,此时这都没有发生,那么main协程锁住,不会向下执行 go func() 那个匿名函数了, 整体死锁 </p>