获取错误:所有 goroutine 都处于睡眠状态 - 死锁

为什么像这样简单的事情不起作用?


c1 := make(chan string)

c1 <- "foo"

fmt.Println(<-c1)

但是如果我把它放在一个 go 例程中它会起作用吗?


c1 := make(chan string)

go func() {

    c1 <- "foo"

}()

fmt.Println(<-c1)

这个问题可能看起来简单而愚蠢,但我试图理解为什么我不能这样做,在这种情况下我不知道有什么更好的问题可以问。


ITMISS
浏览 155回答 1
1回答

梦里花落0921

通道 c1 是一个无缓冲通道。只有当发送方和接收方都准备好时,才能在无缓冲通道上成功通信。线路c1 <- "foo永远阻塞,因为没有接收器准备好。带有 goroutine 的程序可以工作,因为发送和接收 goroutine 会运行到发送方和接收方都准备就绪的点。该程序也将起作用:c2 := make(chan string, 1) // <-- note channel size of onec2 <- "foo"fmt.Println(<-c2)通道 c2 在这个程序中被缓冲。c2 <- "foo"由于缓冲区未满,发送继续进行。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go