为什么像这样简单的事情不起作用?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"由于缓冲区未满,发送继续进行。
- 1 回答
- 0 关注
- 154 浏览
添加回答
举报
0/150
提交
取消