一尘不染

从goroutine捕获返回值

go

以下代码给出了编译错误,提示“意外运行”:

x := go doSomething(arg)

func doSomething(arg int) int{
    ...
    return my_int_value
}

我知道,如果正常调用函数就可以获取返回值,而无需使用goroutine。或者我可以使用频道等

我的问题是为什么不能从goroutine中获取像这样的返回值。


阅读 733

收藏
2020-07-02

共1个答案

一尘不染

严格的答案是您 可以 做到。这可能不是一个好主意。下面的代码可以做到这一点:

var x int
go func() {
    x = doSomething()
}()

这将产生一个新的goroutine,它将进行计算doSomething(),然后将结果分配给x。问题是:您将如何使用x原始goroutine?您可能要确保使用它完成了生成的goroutine,以便您没有竞争条件。但是,如果要执行此操作,则需要一种与goroutine进行通信的方法,并且如果可以执行此操作,为什么不仅仅使用它来将值发送回去呢?

2020-07-02