3 回答

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超4個(gè)贊
這兩個(gè) goroutine 的時(shí)間線顯示了正在發(fā)生的事情:
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因?yàn)?send() 在運(yùn)行時(shí)調(diào)度 main() 再次運(yùn)行之前運(yùn)行到打印語句。
打印兩條消息的關(guān)系之前沒有發(fā)生。它們可以按任一順序打印。

TA貢獻(xiàn)1803條經(jīng)驗(yàn) 獲得超3個(gè)贊
大致:發(fā)送和接收同時(shí)發(fā)生。詳細(xì)信息在決定此行為的 Go Memory Model 中進(jìn)行了解釋。并發(fā)代碼很復(fù)雜...

TA貢獻(xiàn)1805條經(jīng)驗(yàn) 獲得超10個(gè)贊
只有當(dāng)發(fā)送方和接收方都準(zhǔn)備好時(shí),通信才會(huì)成功
關(guān)鍵是這不需要接收方立即開始處理它收到的消息。特別是在您的情況下,它已準(zhǔn)備就緒,因此它無需調(diào)用調(diào)度程序即可接收該值(無上下文切換)。goroutine 繼續(xù)運(yùn)行,直到它再次嘗試發(fā)送,此時(shí)接收器還沒有準(zhǔn)備好,因此調(diào)度程序被調(diào)用等。
- 3 回答
- 0 關(guān)注
- 194 瀏覽
添加回答
舉報(bào)