当main退出时,goroutines是否运行defer()?

当main退出时,goroutines是否运行defer()?,go,channel,deferred,goroutine,Go,Channel,Deferred,Goroutine,如果我有一个goroutine,我可以用这样的方式关闭我在该goroutine上打开的频道吗 defer(close()) 或者当主出口时,是否不为goroutine运行defer语句?不,您不能。main完成后,整个程序终止。因此,如果确实需要,您必须手动同步优雅终止。有整齐的图案,但那是另一回事 但似乎你根本不需要关门。保持香奈儿的开放是可以的,它们完全是被管理的资源,最终会被垃圾收集。关闭更多的是一种设计/意图行为,而不是必要的清理 注意:如果您在main级别defer something

如果我有一个goroutine,我可以用这样的方式关闭我在该goroutine上打开的频道吗

defer(close())


或者当主出口时,是否不为goroutine运行defer语句?

不,您不能。
main
完成后,整个程序终止。因此,如果确实需要,您必须手动同步优雅终止。有整齐的图案,但那是另一回事

但似乎你根本不需要关门。保持香奈儿的开放是可以的,它们完全是被管理的资源,最终会被垃圾收集。关闭更多的是一种设计/意图行为,而不是必要的清理


注意:如果您在
main
级别
defer something()
,那么
something
将在
main
返回后执行。您可以依赖此行为。

您必须同步程序退出序列。当main退出时,通道消失,因此在退出时关闭通道是多余的。
defer
非main go例程中的语句在main终止时不执行。当main终止时,所有其他正在运行的go例程被中断并在停止时终止。它们不执行
延迟
指令。请注意,在main终止时不需要关闭通道。首先要了解的是:goroutines从不运行defer()
defer()
是在函数退出时运行的,这与goroutine退出时完全不同。@Flimzy,但当启动goroutine时,go明确要求它是函数调用。即使您使用了
go func
也必须以括号结束
go func{…}()
他们说的是在退出时关闭,所以不,它们不会被垃圾收集。当应用程序退出时,它们就会消失,就像内存中的其他东西一样。@Adrian,当然,我提到了更广泛的范围,只是为了澄清chan的本质。