3 回答
TA贡献1810条经验 获得超4个赞
这两个 goroutine 的时间线显示了正在发生的事情:
send() main()
fmt.Println("send 1")
sendto <- "Hello" msg := <- hole // sender and receiver both ready
fmt.Println("send 2")
fmt.Println(" recd ", msg) // msg is "Hello"
sendto <- "World" msg := <- hole // sender and receiver both ready
fmt.Println(" recd ", msg) // msg is "World"
fmt.Println("send 3")
sendto <- ""
fmt.Println("send() exit")
send 2之前打印,recd Hello因为 send() 在运行时调度 main() 再次运行之前运行到打印语句。
打印两条消息的关系之前没有发生。它们可以按任一顺序打印。
TA贡献1805条经验 获得超10个赞
只有当发送方和接收方都准备好时,通信才会成功
关键是这不需要接收方立即开始处理它收到的消息。特别是在您的情况下,它已准备就绪,因此它无需调用调度程序即可接收该值(无上下文切换)。goroutine 继续运行,直到它再次尝试发送,此时接收器还没有准备好,因此调度程序被调用等。
- 3 回答
- 0 关注
- 164 浏览
添加回答
举报