当一个函数在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)
}
答案 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)
,则首先它不想编译。