代码如下
func main() {
ch := make(chan int)
go fmt.Println(<- ch)
ch <- 2
fmt.Println("end procc")
}
错误提示
fatal error: all goroutines are asleep - deadlock!
此时也没有在同一个 goroutine中对 ch 进行读写 这么就产生了死锁??
我的理解
goroutine: 如果在方法或者函数调用前添加go关键字之后,
就会开启一个goroutine来执行这个代码块. 主 goroutine 继续自己的工作而不被阻塞.
在这里创建一个没有缓冲的 channel; go fmt.Println(<-ch) 语句执行后就会创建一个新的 goroutine 来执行 fmt.Println(<-ch) 这条语句,
当执行 <-ch 由于ch的没有内容,所以会阻塞这个 新的goroutine;
此时 main goroutine 继续执行 ch <-2 这条语句;
当执行这条语句时因为在 新创建的goroutine中一直在等待读取ch内容.此时main goroutine 只要往 ch中写入内容即可,不会被阻塞; 可为什么 产生死锁????
如果把 go fmt.Println(<- ch) 换成下面形式就没有问题
go func(){
fmt.Println(<- ch)
}()
觉得他们作用都是一样的, 都是函数调用, 区别是func(){}()是匿名函数而fmt.Println()也是fmt包中的函数
期待的回答
说一下你的理解,感谢在先.
The same question is here : deadlock-in-function-which-has-a-channel-parameter
你换成
也会死锁。
为什么呢。因为<-ch作为goroutine的参数,需要先获取。