2013-09-04 3 views
5

Go 함수와 메소드는 여러 값을 반환 할 수 있습니다.Go가 여러 값을 반환 할 때 정확히 무엇이 발생합니까?

func learnMultiple(x, y int) (sum, prod int) { 
    return x + y, x * y // return two values 
} 

합은 자극 = learnMultiple (10, 50)

그것은 튜플 복귀 유사한인가? 내가 배열하고 (파이썬 같은) 일부 언어는 여러 반환 값을 구현하는 튜플을 사용한다는 의미에서, 튜플을 반환 유사한

sum, prod = ["60","500"] 
+3

아니요, 그냥 튜플이 아닌 두 개의 값을 반환합니다. 왜 1을 반환하지만 2를 반환하지 않는 것은 정상입니까? –

+0

난 그냥 궁금해서. 나는 정상적인 1 반환을 찾지 못했습니다. 나는 돌아가는 법을 더 잘 이해하려고 노력하고 있습니다. –

답변

7

뒤에서 무슨 일이 일어나는지 확인하기 위해 컴파일 된 코드를 쉽게 볼 수 있습니다. 우리가 만든 ELF 바이너리를 분해하면

func f() (a, b byte) { 
    return 'x', 'y' 
} 

func main() { 
    a, b := f() 
    println(a, b) 
} 

, 당신은 (우리가 호출이 일어나는 볼 수 인라인이 비활성화되었습니다)이 같은 것을 볼 수 있습니다 :

0000000000400c00 <main.f>: 
400c00:  c6 44 24 08 78   movb $0x78,0x8(%rsp) 
400c05:  c6 44 24 09 79   movb $0x79,0x9(%rsp) 
400c0a:  c3      retq 

0000000000400c10 <main.main>: 
(...) 
400c25:  48 83 ec 10    sub $0x10,%rsp 
400c29:  e8 d2 ff ff ff   callq 400c00 <main.f> 
400c2e:  48 0f b6 1c 24   movzbq (%rsp),%rbx 
400c33:  48 89 d8    mov %rbx,%rax 
400c36:  48 0f b6 5c 24 01  movzbq 0x1(%rsp),%rbx 
(...) 

이 조각을 고려 따라서 f은 결과 바이트를 스택에 넣고 main은 결과 바이트를 스택에 넣고 작업 레지스터에 넣습니다. 다른 컴파일러는 두 개의 스코프 사이에서이 값을 레지스터로 직접 전달할 수도 있습니다.

이것은 모두 C 언어 용 컴파일러가하는 것과 비슷합니다. 단,이 사양은 단일 반환 값만 정의합니다.

3

를 반환 할 수있는

나는 루비 땅에서 왔습니다.

그러나 이동에는 튜플과 같은 것이 없습니다. 하나의 값을 반환하는 함수는 스택에 하나의 슬롯을 할당하여이를 보유합니다. 두 값을 반환하는 함수는 스택에 두 개의 슬롯을 할당하여이를 보유합니다. 등등 ...

관련 문제