我正在学习频道,下面是我尝试过的测试,但发生了死锁func main() { ch := make(chan int) go func() { select { case ch <- 1: fmt.Println("send suc") default: // if comment this line, it will run smoothly fmt.Println("default") } }() time.Sleep(2) // do some time consuming thing... fmt.Printf("receive val: %d", <-ch)}我预计没有死锁,但结果是:defaultfatal error: all goroutines are asleep - deadlock!但是如果我删除defaultor time.Sleep(2),代码将顺利运行,结果:send sucreceive val: 1有人可以解释为什么会发生死锁吗?
1 回答
弑天下
TA贡献1818条经验 获得超8个赞
你有一个select
with default
,这意味着如果没有任何通信操作准备就绪,则select
不会等待,不会阻塞,而是default
立即执行。通道是无缓冲的,所以它上面的发送还没有准备好(因为没有准备好的接收器——main
正在休眠)。
因此,一旦 sleep 结束main
,它就会尝试从通道接收,但到那时没有人尝试发送。僵局。
- 1 回答
- 0 关注
- 79 浏览
添加回答
举报
0/150
提交
取消