Un tipo di parametro preceduto da tre punti (...) è chiamato parametro variadico . Ciò significa che puoi passare qualsiasi numero o argomento in quel parametro (proprio come con fmt.Printf()). La funzione riceverà l'elenco degli argomenti per il parametro come una sezione del tipo dichiarato per il parametro ( []interface{}nel tuo caso). La specifica Go afferma:
Il parametro finale in una firma di funzione può avere un tipo con prefisso .... Una funzione con tale parametro è chiamata variadic e può essere invocata con zero o più argomenti per quel parametro.
Un parametro:
a ...interface{}
È, per la funzione equivalente a:
a []interface{}
La differenza sta nel modo in cui passi gli argomenti a tale funzione. Si fa assegnando ogni elemento della fetta separatamente, o come una singola fetta, nel qual caso dovrai aggiungere il suffisso al valore della sezione con i tre punti. I seguenti esempi risulteranno nella stessa chiamata:
fmt.Println("First", "Second", "Third")
Farà lo stesso di:
s := []interface{}{"First", "Second", "Third"}
fmt.Println(s...)
Questo è spiegato abbastanza bene anche nella specifica Go :
Data la funzione e le chiamate
func Greeting(prefix string, who ...string)
Greeting("nobody")
Greeting("hello:", "Joe", "Anna", "Eileen")
all'interno Greeting, whoavrà il valore nilnella prima chiamata e []string{"Joe", "Anna", "Eileen"}nella seconda.
Se l'argomento finale è assegnabile a un tipo di slice []T, può essere passato invariato come valore per un ...Tparametro se l'argomento è seguito da .... In questo caso non viene creata una nuova slice.
Data la fetta se il richiamo
s := []string{"James", "Jasmine"}
Greeting("goodbye:", s...)
all'interno Greeting, whoavrà lo stesso valore sdello stesso array sottostante.