Bedeutung von… Schnittstelle {} (Punkt Punkt Punkt Schnittstelle)

92

Unten ist ein Teil des Go-Codes, zu dem ich Fragen habe. Was ist ain dieser Funktion konkret ?

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

Kann mir jemand sagen, was die drei Punkte hier sind? Und was macht ...interface{}das?

BufBills
quelle
31
Der Punktpunkt heißt Ellipse.
Erik Westrup

Antworten:

160

Ein Parametertyp mit drei Punkten (...) wird als variadischer Parameter bezeichnet . Das heißt, Sie können eine beliebige Anzahl oder Argumente an diesen Parameter übergeben (genau wie bei fmt.Printf()). Die Funktion erhält die Liste der Argumente für den Parameter als Slice des für den Parameter deklarierten Typs ( []interface{}in Ihrem Fall). In der Go-Spezifikation heißt es:

Dem letzten Parameter in einer Funktionssignatur kann ein Typ mit dem Präfix .... vorangestellt sein. Eine Funktion mit einem solchen Parameter wird als variadisch bezeichnet und kann mit null oder mehr Argumenten für diesen Parameter aufgerufen werden.

Ein Parameter:

a ...interface{}

Ist für die Funktion äquivalent zu:

a []interface{}

Der Unterschied besteht darin, wie Sie die Argumente an eine solche Funktion übergeben. Dies erfolgt entweder durch Angabe jedes Elements des Slice separat oder als einzelnes Slice. In diesem Fall müssen Sie den Slice-Wert mit den drei Punkten versehen. Die folgenden Beispiele führen zum gleichen Aufruf:

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

Wird das gleiche tun wie:

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

Dies wird auch in der Go-Spezifikation recht gut erklärt :

Angesichts der Funktion und Aufrufe

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

innerhalb Greeting, whowird den Wert nilin dem ersten Anruf, und []string{"Joe", "Anna", "Eileen"}in den zweiten.

Wenn das endgültige Argument einem Slice-Typ zugewiesen werden kann []T, kann es unverändert als Wert für einen ...TParameter übergeben werden, wenn auf das Argument folgt .... In diesem Fall wird kein neues Slice erstellt.

Angesichts der Scheibe sund Anruf

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

innerhalb Greeting, whoden gleichen Wert , wie sie smit der gleichen zugrundeliegenden Array.

ANisus
quelle
10

Soweit der interface{}Begriff, ist es die leere Schnittstelle. Mit anderen Worten, die Schnittstelle, die von allen Variablen in Go implementiert wird.

Dies ist analog zu java.lang.Objectoder System.Objectin C #, schließt jedoch jeden Variablentyp in der Sprache ein. Sie können also alles an die Methode übergeben.

Dranyar
quelle