如何区分从具有多个回报的函数中分配和声明值?

Lor*_*son 3 syntax go

当从函数中检索多个返回时,我得到你可以通过使用:=或者通过简单地使用将值分配给已存在的变量来动态地声明值的变量=.当我想要为现有变量分配一个返回值,同时为另一个声明一个新变量时,我的问题出现了.

我目前只通过分配值并bar预先声明所需的变量(在本例中)来解决它,就像在这个片段中一样:

package main

import (
    "fmt"
)

func getFooAndBar() (foo string, bar string) {
    return "Foo", "Bar"
}

func main() {
    var foo = "default"
    var condition = true
    if condition {
        var bar string // Would like to avoid this step if possible
        foo, bar = getFooAndBar()
        fmt.Println(bar)
    }
    fmt.Println(foo)
}
Run Code Online (Sandbox Code Playgroud)

如果我使用:=它由于以下原因而无法构建:

./app.go:16:foo声明并且未使用

那么,是否有可能以某种方式避免bar单独声明的步骤?

tar*_*lah 5

在这种情况下,根据规范,您不能使用短变量声明":="来重新声明foo变量:

与常规变量声明不同,短变量声明可以重新声明变量,前提是它们最初在具有相同类型的同一块中最初声明,并且至少有一个非空变量是新的.因此,重新声明只能出现在多变量简短声明中.重新声明不会引入新变量; 它只是为原始分配一个新值.

通过消除 ./app.go:16: foo declared and not used.

func main() {
    var foo = "default"
    var condition = true
    if condition {
        foo, bar := getFooAndBar()
        fmt.Println(bar) // prints: Bar
        fmt.Println(foo) // prints: Foo
        // _ = foo
    }
    fmt.Println(foo) // prints: default
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下foo,在if块中声明,此声明将创建一个新变量,遮蔽foo外部块中的原始变量,foo只有foo同一块中使用多变量短声明声明并重新声明它时才会重新声明.

func main() {
    var foo = "default"     
    foo, bar := getFooAndBar()
    fmt.Println(bar) //prints: Bar
    fmt.Println(foo) //prints: Foo
}
Run Code Online (Sandbox Code Playgroud)