2 回答

TA貢獻(xiàn)1777條經(jīng)驗 獲得超3個贊
發(fā)生時done <- true,main函數(shù)直接返回。
您可以添加另一個 time.Sleep() 來看看發(fā)生了什么。
time.Sleep(1600 * time.Millisecond)
// ticker.Stop()
done <- true
// fmt.Println("Ticker stopped.")
time.Sleep(1600 * time.Millisecond)

TA貢獻(xiàn)1796條經(jīng)驗 獲得超4個贊
...為什么它不將 Received 'done' 打印到終端?
它確實這樣做了——或者更確切地說,它嘗試了。
當(dāng)主 goroutine(調(diào)用main
package?main
)返回時(或者在此處未發(fā)生的各種情況下更早),Go 程序就會退出。您致電并發(fā)送后main
返回。time.Sleep()
true
done
同時,當(dāng)值到達(dá)通道時,循環(huán)中的 goroutinefor
就會被喚醒。這是在主 Goroutine 發(fā)送之后發(fā)生的,之后主 Goroutine 正在退出。true
done
如果在這個退出過程中,主協(xié)程花費的時間足夠長,那么匿名協(xié)程就有時間打印Received 'done'
。如果在這個退出過程中,主 Goroutine 足夠快,那么匿名 Goroutine 永遠(yuǎn)不會完成,或者甚至永遠(yuǎn)不會開始,打印任何東西,你什么也看不到。(實際輸出是由單個底層系統(tǒng)調(diào)用完成的,因此您要么獲得全部輸出,要么什么也得不到。)
您可以通過多種機制確保您派生的 goroutine 在主協(xié)程退出之前完成,但最簡單的可能是使用,sync.WaitGroup
因為它就是為此設(shè)計的。創(chuàng)建一個 waitgroup,將其計數(shù)器設(shè)置為 1(將 1 添加到其初始零),然后Done
在退出匿名 goroutine 時調(diào)用該函數(shù)。讓主協(xié)程等待它。
- 2 回答
- 0 關(guān)注
- 169 瀏覽
添加回答
舉報