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 关注
- 80 浏览
添加回答
举报