1 回答

TA貢獻(xiàn)2051條經(jīng)驗(yàn) 獲得超10個(gè)贊
當(dāng)main
函數(shù)結(jié)束時(shí),程序也隨之結(jié)束。它不會(huì)等待其他 goroutine 完成。
程序執(zhí)行首先初始化主包,然后調(diào)用函數(shù)
main
。當(dāng)該函數(shù)調(diào)用返回時(shí),程序退出。它不會(huì)等待其他(非main
)goroutine 完成。
因此,當(dāng)您的main
函數(shù)通過(guò)在通道上發(fā)送值而成功時(shí),程序可能會(huì)立即終止,然后另一個(gè) goroutine 有機(jī)會(huì)將接收到的值打印到控制臺(tái)。
如果要確保將值打印到控制臺(tái),則必須將其與退出main
函數(shù)的事件同步:
帶有“完成”頻道的示例(在Go Playground上嘗試):
func my_func(c, done chan int) { fmt.Println(<-c) done <- 1}func main() { c := make(chan int) done := make(chan int) go my_func(c, done) time.Sleep(time.Second) c <- 3 <-done}
由于done
也是一個(gè)無(wú)緩沖通道,因此在main
函數(shù)結(jié)束時(shí)從它接收必須等待在done
通道上發(fā)送一個(gè)值,這c
是在接收到通道上發(fā)送的值并將其打印到控制臺(tái)之后發(fā)生的。
對(duì)看似不確定的運(yùn)行的解釋:
夠程可能會(huì)或可能不會(huì)被并行執(zhí)行在同一時(shí)間。同步確保某些事件發(fā)生在其他事件之前。這是您獲得的唯一保證,也是您唯一應(yīng)該依賴的東西。之前發(fā)生過(guò)2 個(gè)這樣的例子:
go
啟動(dòng)新 goroutine的語(yǔ)句發(fā)生在 goroutine 開始執(zhí)行之前。通道上的發(fā)送發(fā)生在來(lái)自該通道的相應(yīng)接收完成之前。
有關(guān)更多詳細(xì)信息,請(qǐng)閱讀Go 內(nèi)存模型。
回到你的例子:
來(lái)自無(wú)緩沖通道的接收發(fā)生在該通道上的發(fā)送完成之前。
所以你得到的唯一保證是運(yùn)行的 goroutinemy_func()
將接收c
從main()
. 但是一旦接收到值,該main
函數(shù)可能會(huì)繼續(xù),但由于發(fā)送后沒(méi)有更多語(yǔ)句,它只是結(jié)束 - 與程序一起。無(wú)論非main
夠程將有時(shí)間或機(jī)會(huì)與打印fmt.Println()
是沒(méi)有定義。
- 1 回答
- 0 關(guān)注
- 344 瀏覽
添加回答
舉報(bào)