以下两个代码之间的基本区别是什么?不知何故,在第二个示例中,从未调用demo_process2()
,但在第一个示例中,它可以正常工作。
1。
go func() {
Must(demo_process1())
}()
demo_process2()
2。
go Must(demo_process1())
demo_process2()
其中
Must()
:func Must(err error) {
if err != nil {
panic(err)
}
}
最佳答案
Spec: Go statements:
函数值和参数在调用goroutine 中为evaluated as usual,但是与常规调用不同,程序执行不等待调用的函数完成。相反,该函数开始在新的goroutine中独立执行。
在第一个示例中,您将不带参数的匿名函数(函数文字)作为新的goroutine启动。在其中调用Must()
和demo_process1()
,并与demo_process2()
(在“原始” goroutine中执行)同时进行。
但是,在第二个示例中:
go Must(demo_process1())
demo_process2()
作为goroutine启动的函数为
Must()
,其参数在调用goroutine 中评估为。 Must()
的参数是demo_process1()
的返回值,这意味着在启动新的goroutine之前先调用demo_process1()
并等待。只有在返回时,新的goroutine才能启动并调用demo_process2()
(在“原始” goroutine上)。总而言之,在第二个示例中,
demo_process1()
和demo_process2()
不在同一goroutine中同时运行,而是顺序运行。在新的goroutine上仅执行Must()
(与demo_process2()
同时执行)。
关于go - Goroutine概念:使用函数字面量的直接调用与调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59391974/