go - Goroutine概念:使用函数字面量的直接调用与调用

标签 go concurrency goroutine

以下两个代码之间的基本区别是什么?不知何故,在第二个示例中,从未调用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/

相关文章:

go - HTTP 集成测试

go - 通过 Makefile 使用代理

go - 如何将int转换为十六进制

docker - 使用 Docker 的标准 Go 项目布局导致构建上下文问题

java - 当不存在共享对象时使用ThreadLocal

c# - 在非静态类中锁定静态变量是否安全?

ios - Grand Central Dispatch 和并发任务

unit-testing - 测试我的代码不等待的 Goroutine

在 channel 上迭代时写入时 Go 文件 IO 失败

Go例程从一个URL下载到一个文件