`...` 매개변수에 인자 전달하기

... 매개변수에 인자 전달하기

가변 인자(variadic) 함수를 쓸 때, 마지막 파라미터가 받는 값이 실제로 어떻게 생기는지 궁금해 하신 적 있으실 거예요. 이 섹션은 ...T 파라미터에 값이 전달되는 규칙을 정리해 주는 곳이에요.

출처: Go Specification

본문

f가 가변 인자 함수이고 마지막 파라미터 p의 타입이 ...T라면, f 안에서 p의 타입은 []T와 동등해요. f를 호출할 때 p에 실제 인자를 하나도 넘기지 않으면, p에 전달되는 값은 nil이에요. 그 외의 경우에는 전달되는 값이 []T 타입의 새 슬라이스인데요, 뒷단에는 새 underlying array가 생기고 그 연속된 원소들이 바로 실제 인자들이에요. 이 인자들은 모두 T에 대입 가능(assignable)해야 하죠. 따라서 그 슬라이스의 length와 capacity는 p에 묶인 인자의 개수와 같아서, 호출 지점마다 달라질 수 있어요.

함수와 호출부터 볼게요.

func Greeting(prefix string, who ...string)
Greeting("nobody")
Greeting("hello:", "Joe", "Anna", "Eileen")

Greeting 안에서 who는 첫 번째 호출에서는 값이 nil이 되고, 두 번째 호출에서는 []string{"Joe", "Anna", "Eileen"}이 돼요.

만약 마지막 인자가 슬라이스 타입 []T에 대입 가능하고 그 뒤에 ...이 따라온다면, 그 인자는 새 슬라이스를 만들지 않고 ...T 파라미터의 값으로 그대로 전달돼요.

슬라이스 s와 호출을 확인해 볼게요.

s := []string{"James", "Jasmine"}
Greeting("goodbye:", s...)

Greeting 안에서 whos와 같은 값을 갖고, 같은 underlying array를 공유해요.

더 알아보기

  • 가변 인자 함수가 어떤 형태를 갖는지가 궁금하다면 → Function types
  • 함수 호출이 인자를 어떻게 처리하는지 → Calls
  • "대입 가능"이 정확히 어떤 조건인지 → Assignability
  • ...T가 결국 []T와 같다는 게 왜 그런지 → Slice types