뒤에서 무슨 일이 일어나는지 확인하기 위해 컴파일 된 코드를 쉽게 볼 수 있습니다. 우리가 만든 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 언어 용 컴파일러가하는 것과 비슷합니다. 단,이 사양은 단일 반환 값만 정의합니다.
아니요, 그냥 튜플이 아닌 두 개의 값을 반환합니다. 왜 1을 반환하지만 2를 반환하지 않는 것은 정상입니까? –
난 그냥 궁금해서. 나는 정상적인 1 반환을 찾지 못했습니다. 나는 돌아가는 법을 더 잘 이해하려고 노력하고 있습니다. –