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(调用mainpackage main)返回时(或者在此处未发生的各种情况下更早),Go 程序就会退出。您致电并发送后main返回。time.Sleep()truedone
同时,当值到达通道时,循环中的 goroutinefor就会被唤醒。这是在主 Goroutine 发送之后发生的,之后主 Goroutine 正在退出。truedone
如果在这个退出过程中,主协程花费的时间足够长,那么匿名协程就有时间打印Received 'done'。如果在这个退出过程中,主 Goroutine 足够快,那么匿名 Goroutine 永远不会完成,或者甚至永远不会开始,打印任何东西,你什么也看不到。(实际输出是由单个底层系统调用完成的,因此您要么获得全部输出,要么什么也得不到。)
您可以通过多种机制确保您派生的 goroutine 在主协程退出之前完成,但最简单的可能是使用,sync.WaitGroup因为它就是为此设计的。创建一个 waitgroup,将其计数器设置为 1(将 1 添加到其初始零),然后Done在退出匿名 goroutine 时调用该函数。让主协程等待它。
- 2 回答
- 0 关注
- 247 浏览
添加回答
举报
