Syntax 如何区分从具有多个返回的函数中赋值和声明值?

Syntax 如何区分从具有多个返回的函数中赋值和声明值?,syntax,go,Syntax,Go,从函数中检索多个返回时,我发现您可以使用:=动态声明值的变量,或者只需使用=将值分配给现有变量。当我想将一个返回值分配给一个已经存在的变量,同时为另一个变量声明一个新变量时,就会出现问题 我目前只通过预先分配值和声明所需的变量(bar,在本例中)解决了这个问题,如下面的代码片段: package main import ( "fmt" ) func getFooAndBar() (foo string, bar string) { return "Foo", "Bar" }

从函数中检索多个返回时,我发现您可以使用
:=
动态声明值的变量,或者只需使用
=
将值分配给现有变量。当我想将一个返回值分配给一个已经存在的变量,同时为另一个变量声明一个新变量时,就会出现问题

我目前只通过预先分配值和声明所需的变量(
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)
}
如果我使用
:=
它无法生成,原因是:

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


那么,是否有可能避免单独声明
的步骤呢?

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

与常规变量声明不同,短变量声明可能 重新声明变量,前提是这些变量最初是在 具有相同类型的相同块,并且至少有一个非空 变量是新的。因此,重新声明只能出现在 多变量短声明。重新声明不会引入 新变量;它只是将一个新值赋给原始值

通过消除
/app.go:16:foo声明和未使用

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
}
在这种情况下,
foo
if
块中声明,此声明将创建一个新变量在外部块中隐藏原始
foo
变量,只有在
foo
声明并在同一块中使用多变量短声明重新声明后,才会重新声明
foo

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

因为
:=
会创建一个新的
foo
阴影,你不能在这里使用它。你所拥有的是做这件事的方法(
:=
毕竟只是一条捷径)。