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 關注
- 193 瀏覽
添加回答
舉報