Goroutine 概念:直接调用 vs 使用函数字面量调用

Kam*_*san -3 concurrency go goroutine

以下两个代码之间的基本区别是什么?不知何故,在第二个示例demo_process2()中从未被调用,但在第一个示例中工作正常。

    1.
go func() {
    Must(demo_process1())
}()

demo_process2()
Run Code Online (Sandbox Code Playgroud)
    2.
go Must(demo_process1())
demo_process2()
Run Code Online (Sandbox Code Playgroud)

其中Must()

func Must(err error) {
    if err != nil {
        panic(err)
    }
}
Run Code Online (Sandbox Code Playgroud)

icz*_*cza 5

规范:Go 语句:

函数值和参数在调用 goroutine 中照常评估,但与常规调用不同,程序执行不会等待调用的函数完成。相反,该函数开始在新的 goroutine 中独立执行。

在你的第一个例子中,你启动一个没有参数的匿名函数(一个函数文字)作为一个新的 goroutine。Must()demo_process1()在其中调用,同时demo_process2()(在“原始”goroutine 中执行)。

然而,在你的第二个例子中:

go Must(demo_process1())
demo_process2()
Run Code Online (Sandbox Code Playgroud)

作为 goroutine 启动的函数是Must(),其参数在调用 goroutine中求值。参数 ofMust()是 的返回值demo_process1(),表示demo_process1()在新的 goroutine 启动之前先被调用并等待。只有当它返回时,新的 goroutine 才能被启动和demo_process2()调用(在“原始”goroutine 上)。

总而言之,在第二个示例中demo_process1()demo_process2()它们不是并发运行,而是在同一个 goroutine 中按顺序运行。仅在Must()新的 goroutine 上执行(与 并发demo_process2())。