首页 > 解决方案 > 短格式 goroutine 返回值

问题描述

我已经使用 Go 有一段时间了。我想知道是否有任何简短的代码可以从 goroutine 获取返回值。

    x := 3
    ch := make(chan int)
    go func(xIn int) (xOut int) {
        xOut = x + 1
        ch <- xOut
        return xOut
    }(x)
    nextX := <-ch
    fmt.Println(x, nextX)

建议的短格式:

    x := 3
    nextX := go func(xIn int) (xOut int) {
        xOut = x + 1
        return xOut
    }(x)
    fmt.Println(x, nextX)

重点:

问题不在于如何去做,而在于为什么 go-compiler 没有提供这样的功能。

标签: go

解决方案


让我们假设存在一些f()具有某种返回类型的函数T

您希望捕获 的返回值f()。显然,我们可以这样做:

x := f()

如果:

x := go f()

等待某个值分配给f(),这两个调用之间有什么区别?returnx

(如果:

x := go f()

不等待f()一个return值,当您尝试访问变量时会发生什么x?)


如果你想写:

x := 3
nextX := func(xIn int) (xOut int) {
    xOut = x + 1
    return xOut
}(x)
fmt.Println(x, nextX)

你可以在今天存在的 Go 中这样做。(在Go Playground上尝试一下。另外,我怀疑您希望内部函数使用它的xIn变量,而不是闭包捕获的x变量,但两种方式的效果都是一样的。)


推荐阅读