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

UTK*_*rma -3 go

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

第一 :

func main() {

  channel := make(chan int)
  go demo(channel)
  num := <-channel
  println(num)

}

func demo(channel chan int) {
  channel <- 2
}
Run Code Online (Sandbox Code Playgroud)

第二个:

func main() {
    demo()
}

func demo() {
    channel := make(chan int)
    channel <- 2
    num := <-channel
    println(num)
}
Run Code Online (Sandbox Code Playgroud)

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

col*_*tor 5

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

进行此更改,它将运行:

channel := make(chan int, 1)
Run Code Online (Sandbox Code Playgroud)