2015-01-21 96 views
1

当一个函数在Golang中返回多个变量时,变量的范围是什么?在附上的代码中,我无法弄清b的范围。Golang:函数返回值的范围

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

该变量将持续到main的最后一行;然而,在第二次调用addMulti()时,'b'的值会发生变化。这是任何编程语言的典型特征,它与多次返回无关。 – weberc2 2015-01-21 16:19:21

回答

8

我们不是在谈论函数的返回值的作用域,而是你指定返回值的变量的作用域。

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

a, b := addMulti(1, 2) 

但你使用其他Short Variable declaration在这一行:: - 因为b已声明 - 只是分配一个新的值

c, b := addMulti(3, 4) 

起初,你在这行做到它。 b将在您的范围内,直到您的main()函数结束。 Go语言规范引用:

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

+0

所以我们可以将第二次调用的代码更改为addMulti(3,4),以便将返回值分配给a,b? – G4143 2015-01-21 11:55:02

+0

@ G4143你想改变它的原因是什么?保持'b'的前一个值?如果是这样,那么只需使用一个新变量,例如:'c,d:= addMulti(3,4)' – icza 2015-01-21 11:57:52

+0

值得注意的是,这与多个返回值无关 - 可以用'b := 4'后面加上'b = 5'。你只是改变变量中包含的值。 – weberc2 2015-01-21 16:20:32

0

这是一个块内的正常变量。从the spec

函数内声明恒定或可变标识符的范围开始于常量实现或VarSpec(ShortVarDecl简称变量声明)的端部,并在包含块的最内的结尾处结束。

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

0

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