[go] … 인터페이스 {}의 의미 (도트 도트 인터페이스)

아래는 질문이있는 Go 코드입니다. 구체적 a으로이 기능 은 무엇 입니까?

func DPrintf(format string, a ...interface{}) (n int, err error) {
  if Debug > 0 {
    n, err = fmt.Printf(format, a...)
  }
  return
}

여기에 세 개의 점이 무엇인지 말해 줄 수 있습니까? 그리고 무엇을 ...interface{}합니까?



답변

세 개의 점 (…)으로 시작하는 매개 변수 유형을 가변 매개 변수 라고합니다 . 즉, 어떤 숫자 나 인수도 해당 매개 변수에 전달할 수 있습니다 (와 마찬가지로 fmt.Printf()). 함수는 매개 변수에 대해 선언 된 유형의 조각으로 매개 변수에 대한 인수 목록을받습니다 ( []interface{}귀하의 경우). 이동 사양 상태 :

함수 시그니처의 마지막 매개 변수에는 … 접두사가 붙은 유형이있을 수 있습니다. 이러한 매개 변수가있는 함수를 가변이라고하며 해당 매개 변수에 대해 0 개 이상의 인수를 사용하여 호출 할 수 있습니다.

매개 변수 :

a ...interface{}

다음과 같은 기능의 경우입니다.

a []interface{}

차이점은 이러한 함수에 인수를 전달하는 방법입니다. 슬라이스의 각 요소를 개별적으로 제공하거나 단일 슬라이스로 제공하여 수행되며,이 경우 슬라이스 값에 세 개의 점을 붙여야합니다. 다음 예에서는 동일한 호출이 발생합니다.

fmt.Println("First", "Second", "Third")

다음과 같은 작업을 수행합니다.

s := []interface{}{"First", "Second", "Third"}
fmt.Println(s...)

이것은 Go 사양 에서도 잘 설명됩니다.

함수와 호출이 주어지면

   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, who같은 값을 가질 것이다 s동일한 기본 배열한다.


답변

마찬가지로 지금까지와 같은 interface{}용어는 빈 인터페이스입니다. 즉, Go의 모든 변수에 의해 구현 된 인터페이스입니다.

이것은 일종의 유사의이다 java.lang.Object또는 System.ObjectC #에서,하지만 언어의 모든 변수 형식의 대신에 포함됩니다. 따라서 모든 것을 메서드에 전달할 수 있습니다.


답변