Golang:函数的多个返回值的作用域

p4tfgftt  于 2023-08-01  发布在  Go
关注(0)|答案(4)|浏览(70)

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

}

字符串

8yoxcaq7

8yoxcaq71#

我们不是在讨论函数返回值的作用域,而是你将返回值赋给的变量的作用域。
在本例中,变量b的作用域是函数体,从声明它的位置开始。
首先你在这行做:

a, b := addMulti(1, 2)

字符串
但是你在这一行使用了另一个Short Variable声明:

c, b := addMulti(3, 4)


因为b已经声明了,所以它只是给它赋了一个新值。b将一直在作用域中,直到main()函数结束。引用Go语言规范:
与常规变量声明不同,短变量声明可以重新声明变量,只要它们最初在同一块中以相同类型声明,并且至少有一个非空变量是新的。因此,重新声明只能出现在多变量短声明中。重新声明不会引入新变量;它只是给原始值赋一个新值。

2wnc66cl

2wnc66cl2#

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

j13ufse2

j13ufse23#

B变量的作用域是main.main()。在第二次赋值c, b := addMulti(3, 4)中,引入新变量c,并赋值第一次赋值中引入的变量b。如果你把第二个赋值改为a, b := addMulti(3, 4),和第一个赋值一样,它就不会编译。

acruukt9

acruukt94#

如果是这样,请尝试以下代码:

func makeRequest(uri string, payload string) {
    var resp http.Response
    var err error

    if payload == "" {
        resp, err := http.Get(uri)
    }
    if err != nil {
        return
    }

    bytes, err := io.ReadAll(resp.Body)
    fmt.Println(bytes)
}

字符串

相关问题