2015-01-21 3 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의 마지막 줄까지 살 수 있습니다. 그러나 'b'의 값은 addMulti()에 대한 두 번째 호출에서 변경 될 것입니다. 이것은 모든 프로그래밍 언어의 전형이며, 다중 반환과는 아무런 관련이 없습니다. – weberc2

답변

8

우리는 함수의 반환 값의 범위가 아니라 반환 값을 할당하는 변수의 범위에 대해 설명합니다.

귀하의 경우에 변수 bscope은 신고 한 시점부터의 기능 본문입니다.

a, b := addMulti(1, 2) 

그러나 당신이이 줄에서 다른 Short Variable declaration를 사용합니다 : - 이미 선언 b 이후 - 새 값을 할당 단지

c, b := addMulti(3, 4) 

는 처음에는이 라인에서 그것을 할 그것에. bmain() 기능이 끝날 때까지 범위에 있습니다. 이동 언어 사양에서 인용 : 일반 변수 선언과 달리

, 변수를 재 선언 할 수 있습니다 짧은 변수 선언은 원래 비어 있지 않은 변수 중 적어도 하나 이전에 같은 종류와 같은 블록에서 선언 하였다 제공 새로운 것입니다. 따라서 재 선언은 다중 변수 짧은 선언으로 만 나타날 수 있습니다. 재 선언은 새로운 변수를 도입하지 않습니다. 원래 값에 새로운 값을 할당합니다.

+0

그래서 우리는 addMulti (3, 4)에 대한 두 번째 호출 코드를 변경하여 반환 값을 a, b? – G4143

+0

@ G4143 무엇을 왜 바꾸시겠습니까? 'b'의 이전 값을 유지 하시겠습니까? 'c, d : = addMulti (3, 4)' – icza

+0

아마도 이것은 여러 개의 반환 값과는 아무런 관련이 없다는 것을 주목할 필요가있다. 아마도'b : = 4' 다음에'b = 5'가옵니다. 변수에 포함 된 값을 변경하는 것입니다. – weberc2

0

블록 내부의 일반적인 변수입니다. the spec에서 :

함수 내에서 선언 된 상수 또는 변수 식별자의 범위는 ConstSpec 또는 VarSpec (단 변수 선언 용 ShortVarDecl)의 끝에서 시작하여 블록을 포함하는 가장 안쪽의 끝에서 종료된다.

두 번째 호출에서 동일한 b 변수의 값을 다시 할당하기 만하면됩니다. 그것의 범위는 동일합니다.

0

b 변수의 범위는 main.main()입니다. 두 번째 할당 c, b := addMulti(3, 4)에서는 새 변수 c를 도입하고 첫 번째 할당에서 도입 된 변수 b를 할당합니다. 두 번째 할당을 a, b := addMulti(3, 4)으로 변경하면 처음에는 컴파일하지 않으려 고합니다.