为了账号安全,请及时绑定邮箱和手机立即绑定

Golang:函数多返回值的范围

Golang:函数多返回值的范围

Go
一只名叫tom的猫 2021-09-13 10:08:54
当一个函数在 Golang 中返回多个变量时,变量的作用域是什么?在附加的代码中,我无法弄清楚 b 的范围。package mainimport (    "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 回答

?
MMTTMM

TA贡献1869条经验 获得超4个赞

我们不是在谈论函数返回值的范围,而是在谈论您将返回值分配给的变量的范围。

在您的情况下,变量的范围b是函数体,从您声明它的点开始。

首先你在这一行做:

a, b := addMulti(1, 2)

但是你在这一行使用了另一个短变量声明:

c, b := addMulti(3, 4)

这 - 因为b已经声明 - 只是为其分配一个新值。b将在范围内,直到您的main()功能结束。引用 Go 语言规范:

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


查看完整回答
反对 回复 2021-09-13
?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

它是块内的普通变量。从规范

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

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


查看完整回答
反对 回复 2021-09-13
?
开心每一天1111

TA贡献1836条经验 获得超13个赞

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


查看完整回答
反对 回复 2021-09-13
  • 3 回答
  • 0 关注
  • 170 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信