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

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

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

Go
ITMISS 2021-11-08 16:50:34
为什么像这样简单的事情不起作用?c1 := make(chan string)c1 <- "foo"fmt.Println(<-c1)但是如果我把它放在一个 go 例程中它会起作用吗?c1 := make(chan string)go func() {    c1 <- "foo"}()fmt.Println(<-c1)这个问题可能看起来简单而愚蠢,但我试图理解为什么我不能这样做,在这种情况下我不知道有什么更好的问题可以问。
查看完整描述

1 回答

?
梦里花落0921

TA贡献1772条经验 获得超5个赞

通道 c1 是一个无缓冲通道。只有当发送方和接收方都准备好时,才能在无缓冲通道上成功通信。


线路c1 <- "foo永远阻塞,因为没有接收器准备好。


带有 goroutine 的程序可以工作,因为发送和接收 goroutine 会运行到发送方和接收方都准备就绪的点。


该程序也将起作用:


c2 := make(chan string, 1) // <-- note channel size of one

c2 <- "foo"

fmt.Println(<-c2)

通道 c2 在这个程序中被缓冲。c2 <- "foo"由于缓冲区未满,发送继续进行。


查看完整回答
反对 回复 2021-11-08
  • 1 回答
  • 0 关注
  • 154 浏览
慕课专栏
更多

添加回答

举报

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