2 回答

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

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