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
, who
wird den Wert nil
in 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 ...T
Parameter übergeben werden, wenn auf das Argument folgt ...
. In diesem Fall wird kein neues Slice erstellt.
Angesichts der Scheibe s
und Anruf
s := []string{"James", "Jasmine"}
Greeting("goodbye:", s...)
innerhalb Greeting
, who
den gleichen Wert , wie sie s
mit der gleichen zugrundeliegenden Array.