我相信对于这种微不足道的情况有一个简单的解释,但是我对go
并发模型还是个新手.
当我运行这个例子时
package main
import "fmt"
func main() {
c := make(chan int)
c <- 1
fmt.Println(<-c)
}
我得到了这个错误:
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan send]:
main.main()
/home/tarrsalah/src/go/src/github.com/tarrsalah/tour.golang.org/65.go:8 +0x52
exit status 2
为什么?
在goroutine
中包装c <-
会使示例按照我们的预期运行
package main
import "fmt"
func main() {
c := make(chan int)
go func(){
c <- 1
}()
fmt.Println(<-c)
}
再说一遍,为什么?
拜托,我需要深入的解释,而不仅仅是如何消除死锁和修复代码.