Golang:函数的多重返回值的范围

时间:2015-01-21 11:44:22

标签: go

当一个函数在Golang中返回多个变量时,变量的范围是什么?在附带的代码中,我无法弄清楚b的范围。

package main

import (
    "fmt"
)

func addMulti(x, y int) (int, int) {
    return (x + y), (x * y)
}

func main() {
    //what is the scope of the b variable here?
    a, b := addMulti(1, 2)

    fmt.Printf("%d %d\n", a, b)

    //what is the scope of the b variable here?
    c, b := addMulti(3, 4)

    fmt.Printf("%d %d\n", c, b)

}   

3 个答案:

答案 0 :(得分:9)

我们不是在讨论函数返回值的范围,而是讨论为返回值赋值的变量的范围。

在您的情况下,变量b的{​​{3}}是函数体,从您声明它的位置开始。

首先,您可以在此行中执行此操作:

a, b := addMulti(1, 2)

但是你在这一行使用了另一个scope

c, b := addMulti(3, 4)

- 由于b已经被声明 - 只需为其指定一个新值。在b函数结束之前,main()将在范围内。引用Go语言规范:

  

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

答案 1 :(得分:0)

它是块内的正常变量。来自the spec

  

在函数内声明的常量或变量标识符的范围从ConstSpec或VarSpec的末尾开始(ShortVarDecl用于短变量声明),并在最内层包含块的末尾结束。

在第二个调用中,您只需重新分配相同b变量的值。它的范围是一样的。

答案 2 :(得分:0)

b变量的范围是main.main()。在第二个赋值c, b := addMulti(3, 4)中,引入新变量c,并赋予在第一个赋值中引入的变量b。如果您将第二个分配更改为a, b := addMulti(3, 4),则首先它不想编译。