Un tipo de parámetro con el prefijo de tres puntos (...) se denomina parámetro variádico . Eso significa que puede pasar cualquier número o argumentos a ese parámetro (al igual que con fmt.Printf()
). La función recibirá la lista de argumentos para el parámetro como una porción del tipo declarado para el parámetro ( []interface{}
en su caso). La especificación Go establece:
El parámetro final en la firma de una función puede tener un tipo con el prefijo .... Una función con dicho parámetro se llama variadic y puede invocarse con cero o más argumentos para ese parámetro.
Un parámetro:
a ...interface{}
Es, para la función equivalente a:
a []interface{}
La diferencia es cómo se pasan los argumentos a dicha función. Se hace dando cada elemento de la rebanada por separado, o como una sola rebanada, en cuyo caso tendrá que agregar el sufijo al valor de la rebanada con los tres puntos. Los siguientes ejemplos resultarán en la misma llamada:
fmt.Println("First", "Second", "Third")
Hará lo mismo que:
s := []interface{}{"First", "Second", "Third"}
fmt.Println(s...)
Esto se explica bastante bien en la especificación Go :
Dada la función y las llamadas
func Greeting(prefix string, who ...string)
Greeting("nobody")
Greeting("hello:", "Joe", "Anna", "Eileen")
dentro Greeting
, who
tendrá el valornil
en la primera llamada y []string{"Joe", "Anna", "Eileen"}
en la segunda.
Si el argumento final se puede asignar a un tipo de segmento []T
, se puede pasar sin cambios como el valor de un...T
parámetro si el argumento va seguido de ...
. En este caso, no se crea ningún segmento nuevo.
Dado el corte s
y la llamada
s := []string{"James", "Jasmine"}
Greeting("goodbye:", s...)
inside Greeting
, who
tendrá el mismo valor que s
con la misma matriz subyacente.