Go:为新旧变量分配多个返回值函数

Ent*_*Zha 19 go

在go中有返回两个值或更多值的函数,通常一个是错误.假设我想将第一个返回值存储到已经初始化的变量中,但我想初始化变量以包含内联错误.有没有办法做到这一点?

例如,假设我有这个代码

var a int
//This code doesn't compile because err doesn't exist
a, err = SomeFuncWithTwoReturnValues()
//This code doesn't compile either
a, err := SomeFuncWithTwoReturnValues()
Run Code Online (Sandbox Code Playgroud)

我知道你可以做到这一点,但我希望有一种方法可以全部内联

var a int
var err error
a, err = SomeFuncWithTwoReturnValues()
Run Code Online (Sandbox Code Playgroud)

要么

a, err := SomeFuncWithTwoReturnValues()
Run Code Online (Sandbox Code Playgroud)

编辑:上面的代码实际编译,所以我回顾了我的代码,深入了解并创建了一个实际复制问题的快速示例(不仅仅是在我的脑海里......).

package main

func myfunc() (int, int) {
    return 1, 1
}

func main() {
    a := make([]int, 1)
    a[0], b := myfunc()
    a[0] = b
}
Run Code Online (Sandbox Code Playgroud)

编译说main.go|9| non-name a[0] on left side of :=.如果我做它=而不是,:=那么b永远不会创建.我觉得虽然没有简写的方法.

Seb*_*020 7

Golang 不是一种非常一致的语言。这是一个很好的例子。一开始我很困惑,如果他们总是允许:=操作员的话,事情会简单得多。编译器足够聪明,可以检测已经声明的变量:

package main

import "fmt"

func testFunc() (int,error) {
   return 42,fmt.Errorf("Test Error")
}

func main() {
   number1,err := testFunc() // OK
   number2,err := testFunc() // OK, even if err is already defined
   number1,err = testFunc()  // OK
   // number1,err := testFunc() // ERROR: no new variables on left side of :=

   fmt.Println(number1,number2,err)
}
Run Code Online (Sandbox Code Playgroud)

游乐场链接:https://play.golang.org/p/eZVB-kG6RtX

这是不一致的,因为 golang 允许您使用:=已声明的变量(如果您在分配给它们的同时还引入了新变量)。因此编译器可以检测到变量已经存在并跳过它们的声明。但 golang 开发人员决定仅当您引入至少一个新值时才允许这样做。最后一个例子表明了这一点。


E. *_*fat 5

正如您在评论中提到的,您需要使用=运算符来分配给您已经声明的变量。该:=运算符用于同时声明和分配变量。两者是一样的:

var x int
x = 5
//is the same as
x := 5
Run Code Online (Sandbox Code Playgroud)

这个解决方案至少会编译:

package main

func myfunc() (int, int) {
    return 1, 1
}

func main() {
    var b int
    a := make([]int, 1)
    a[0], b = myfunc()
    a[0] = b
}
Run Code Online (Sandbox Code Playgroud)

为了回答您的问题,我认为没有办法在返回多个值时同时使用未声明和声明的变量。这将尝试同时使用两个不同的运算符。

编辑:刚刚从编译的代码中看到了您的示例,因此您似乎已经熟悉 go 的赋值运算符。无论如何,我会留下这个例子。