为了账号安全,请及时绑定邮箱和手机立即绑定

在同一范围内调用通道会导致恐慌

在同一范围内调用通道会导致恐慌

Go
凤凰求蛊 2022-10-24 15:17:36
有人可以向我解释为什么第一个代码运行但第二个代码失败?第一 :func main() {  channel := make(chan int)  go demo(channel)  num := <-channel  println(num)}func demo(channel chan int) {  channel <- 2}第二个:func main() {    demo()}func demo() {    channel := make(chan int)    channel <- 2    num := <-channel    println(num)}在第二个中,我在演示功能中从通道中获取输入,但它仍然会造成死锁,有人可以简要解释一下吗?我可以看到,当我在同一范围内调用通道时,它会导致问题。
查看完整描述

2 回答

?
智慧大石

TA贡献1946条经验 获得超3个赞

您的通道是无缓冲的,因此写入它会阻塞,因为没有其他 goroutine 可以从中读取。

进行此更改,它将运行:

channel := make(chan int, 1)


查看完整回答
反对 回复 2022-10-24
?
繁星淼淼

TA贡献1775条经验 获得超11个赞

在第一种情况下,写入通道是在一个单独的 goroutine 中。当主 goroutine 阻塞从通道读取时,仍然有一个 goroutine 可以写入通道,因此它不是死锁。最终,该 goroutine 写入通道并且程序完成。

第二种情况,写入通道块,没有其他goroutine在运行,所以是死锁。


查看完整回答
反对 回复 2022-10-24
  • 2 回答
  • 0 关注
  • 63 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信