2015-01-21 111 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),與第一個作業相同,則不想編譯。