当一个函数在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)
}
字符串
4条答案
按热度按时间8yoxcaq71#
我们不是在讨论函数返回值的作用域,而是你将返回值赋给的变量的作用域。
在本例中,变量
b
的作用域是函数体,从声明它的位置开始。首先你在这行做:
字符串
但是你在这一行使用了另一个Short Variable声明:
型
因为
b
已经声明了,所以它只是给它赋了一个新值。b
将一直在作用域中,直到main()
函数结束。引用Go语言规范:与常规变量声明不同,短变量声明可以重新声明变量,只要它们最初在同一块中以相同类型声明,并且至少有一个非空变量是新的。因此,重新声明只能出现在多变量短声明中。重新声明不会引入新变量;它只是给原始值赋一个新值。
2wnc66cl2#
它是块中的普通变量。从spec:
在函数内部声明的常量或变量标识符的作用域开始于ConstSpec或VarSpec的末尾(短变量声明的ShortVarDecl),并结束于最里面的包含块的末尾。
在第二个调用中,您只是重新分配同一个
b
变量的值。其范围是相同的。j13ufse23#
B变量的作用域是
main.main()
。在第二次赋值c, b := addMulti(3, 4)
中,引入新变量c,并赋值第一次赋值中引入的变量b。如果你把第二个赋值改为a, b := addMulti(3, 4)
,和第一个赋值一样,它就不会编译。acruukt94#
如果是这样,请尝试以下代码:
字符串