我确信这个微不足道的情况有一个简单的解释,但我是go并发模型的新手.
当我运行这个例子
package main
import "fmt"
func main() {
c := make(chan int)
c <- 1
fmt.Println(<-c)
}
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
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
Run Code Online (Sandbox Code Playgroud)
为什么?
包装c <-在一个goroutine使得示例运行正如我们预期的那样
package main
import "fmt"
func main() {
c := make(chan int)
go func(){
c <- 1
}()
fmt.Println(<-c)
}
Run Code Online (Sandbox Code Playgroud)
再次,为什么?
请,我需要深入解释,而不仅仅是如何消除死锁并修复代码.
有人可以解释一下,为什么如果通道被缓冲,程序不会以fatal_error退出?
无缓冲的频道
package main
func main() {
c := make(chan int)
c <- 3
}
fatal error: all goroutines are asleep - deadlock!
Run Code Online (Sandbox Code Playgroud)
缓冲频道
package main
func main() {
c := make(chan int, 1)
c <- 3
}
[no output]
Program exited.
Run Code Online (Sandbox Code Playgroud)
谢谢!
我认为它们是相同的,但是在go内存模型中有这样的词:如果通道被缓冲(例如c = make(chan int, 1)),那么程序将不能保证打印"hello,world" - 它可能会打印出空字符串,崩溃或做其他事情.它是否正确?