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

有人可以向我解释为什么第一个代码运行但第二个代码失败?


第一 :


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)

}

在第二个中,我在演示功能中从通道中获取输入,但它仍然会造成死锁,有人可以简要解释一下吗?我可以看到,当我在同一范围内调用通道时,它会导致问题。


凤凰求蛊
浏览 79回答 2
2回答

智慧大石

您的通道是无缓冲的,因此写入它会阻塞,因为没有其他 goroutine 可以从中读取。进行此更改,它将运行:channel&nbsp;:=&nbsp;make(chan&nbsp;int,&nbsp;1)

繁星淼淼

在第一种情况下,写入通道是在一个单独的 goroutine 中。当主 goroutine 阻塞从通道读取时,仍然有一个 goroutine 可以写入通道,因此它不是死锁。最终,该 goroutine 写入通道并且程序完成。第二种情况,写入通道块,没有其他goroutine在运行,所以是死锁。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go