Funciones Variádicas – parámetros
Esta función supone reemplazar el fmt.Println para imprimir solo si la variable global Debug es true
func DPrintf(format string, str ...interface{}) (n int, err error) {
if Debug {
n, err = fmt.Printf(format, str...)
}
return n, err
}
En este caso, la función recibe una cantidad variable de parámetros de cualquier tipo (interface{}). Un tipo de parámetro con prefijo con tres puntos (…) es llamado
parámetro variádico.
a ...interface{} es equivalente a []interface{}
La diferencia es cómo se pasan los argumentos a tal función. Se hace pasando cada elemento por separado, o en un solo array, en cuyo caso hay que poner el sufijo de los tres puntos.
De hecho, los argumentos pueden ser accedidos de esta forma:
for _, s := range str {
fmt.Println(s)
}
Arguments to variadic functions
In
the above function DPrintf, arguments must be passed as a list of
elements separated by commas. There is a way to “unapck” the slice and
pass it as a valid argument using …
toBePrinted := []int{2, 4, 8, 16}
fmt.Println(Sum(toBePrinted...))
Array literales
La notación …
especifica una longitud igual al número de elementos en el literal. Tal que se puede empezar a enumerar los valores sin tener cuidado de cuántos elemento tiene.
greeks := [...]string{"alpha", "beta", "gamma", "delta"}
// len(greeks) es 4
El caso de append
La función append tiene una firma así:
func append(where []T, what ...T)
por lo que puede ser llamada de estas dos maneras con uno o dos argumentos
append(slice, 'a') // one argument
append(slice, 'b', 'c') // two arguments
entonces, si se quiere haber un append de muchas cosas, … esta es una forma.
append(slice, []byte{'a', 'b', 'c'}...)