Gorutine从main返回后未完成执行。为什么?

Gorutine从main返回后未完成执行。为什么?,go,goroutine,Go,Goroutine,我正在努力理解golang的上下文。我从中复制了一个示例,并对其进行了一些更改: 游乐场: 完成的永远不会被打印出来。游乐场: 我希望在匿名函数中启动的go例程仍然处于活动状态。一旦由于延迟而调用了cancel,select将不再阻止为 case <-ctx.Done(): 应该有。然而,它似乎刚刚结束,除非我等待一秒钟,给它时间。这种行为似乎非常错误 这种行为似乎非常错误 不是。这就是指定程序执行的方式。在main及其延迟函数返回后,程序退出 程序执行首先初始化主包,然后调用main函

我正在努力理解golang的上下文。我从中复制了一个示例,并对其进行了一些更改: 游乐场:

完成的永远不会被打印出来。游乐场:

我希望在匿名函数中启动的go例程仍然处于活动状态。一旦由于延迟而调用了cancel,select将不再阻止为

case <-ctx.Done():
应该有。然而,它似乎刚刚结束,除非我等待一秒钟,给它时间。这种行为似乎非常错误

这种行为似乎非常错误

不是。这就是指定程序执行的方式。在main及其延迟函数返回后,程序退出

程序执行首先初始化主包,然后调用main函数。当函数调用返回时,程序退出。它不会等待其他非主goroutine完成


一旦func main返回,即在func main中的所有内容之后,“延迟取消”将执行“取消”。虽然延迟取消是一种常见的模式,但您可能不想在代码中延迟太多。因此,如果我理解正确,在从main返回后,所有其他go例程“可能”继续执行一些工作,直到所有延迟函数都完成为止,但是没有保证。延迟函数在周围函数返回之前执行。主回路返回后,什么也没有发生。
defer time.Sleep(1 * time.Second)
case <-ctx.Done():