Golang:函数多返回值的范围

当一个函数在 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)


}   


一只名叫tom的猫
浏览 171回答 3
3回答

MMTTMM

我们不是在谈论函数返回值的范围,而是在谈论您将返回值分配给的变量的范围。在您的情况下,变量的范围b是函数体,从您声明它的点开始。首先你在这一行做:a, b := addMulti(1, 2)但是你在这一行使用了另一个短变量声明:c, b := addMulti(3, 4)这 - 因为b已经声明 - 只是为其分配一个新值。b将在范围内,直到您的main()功能结束。引用 Go 语言规范:与常规变量声明不同,短变量声明可以重新声明变量,前提是它们最初在同一块中以相同类型声明,并且至少有一个非空变量是新的。因此,重新声明只能出现在多变量短声明中。重新声明不会引入新变量;它只是为原始值分配一个新值。

凤凰求蛊

它是块内的普通变量。从规范:在函数内声明的常量或变量标识符的范围从 ConstSpec 或 VarSpec(短变量声明的 ShortVarDecl)的末尾开始,并在最里面的包含块的末尾结束。在第二次调用中,您只是重新分配同一b变量的值。它的范围是一样的。

开心每一天1111

b 变量的范围是main.main(). 在第二次赋值中, c, b := addMulti(3, 4)您引入了新变量 c,并分配了在第一次赋值中引入的变量 b。如果您将第二个分配更改为a, b := addMulti(3, 4)与第一个相同,则它不想编译。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go