Lecciones del módulo (3/5)
Funciones variádicas
Funciones variables aceptan un número arbitrario de argumentos del
mismo tipo. Los declaras poniendo ... antes del tipo del último
parámetro. Dentro de la función, el parámetro es un sector.
Declaración
func sum(nums ...int) int {
tot := 0
for _, n := range nums {
tot += n
}
return tot
}
sum() // 0 (nums = []int{})
sum(1) // 1
sum(1, 2, 3, 4) // 10Sólo el último parámetro puede ser variable:
func log(prefix string, values ...any) { ... } // ok
// func wrong(...int, suffix string) {} // ERROREExtender una rebanada
Si ya tiene un segmento, puede pasarlo a una función variada con
...:
nums := []int{1, 2, 3}
sum(nums...) // 6 — espande lo slice nei singoli argomentiEl "..." va después del segmento. Sin propagación obtendrías un tipo
error: estarías pasando un []int donde la función espera una secuencia
de int.
nums es un segmento, no un contenedor nuevo
Dentro de la función nums tiene el tipo []int. Toda la rebanada estándar
Trabajo de operaciones: len(nums), nums[0], range, etc.
Caso de uso clásico: fmt.Println
Todas las funciones Print* de fmt son variadas:
// signature (semplificata):
// func Println(a ...any) (n int, err error)
fmt.Println("ciao", 42, true)
args := []any{"a", "b", "c"}
fmt.Println(args...)Pruébalo
Defina sum(nums ...int) int que devuelva la suma de todos los argumentos.
Mostrar pista
Dentro de la función `nums` tiene el tipo `[]int`.
Solución disponible después de 3 intentos
Llame a la función de suma existente pasando los números de segmento con `nums...` extendido.
Mostrar pista
El `...` va DESPUÉS del nombre del segmento.
Solución disponible después de 3 intentos
Dentro de `func f(args ...string)`, ¿qué tipo es `args`?
func f(args ...string) {
_ = args
}Resumen
...Tcomo ÚLTIMO parámetro = función variable; dentro está[]T.- Llamado con valores únicos: el compilador los recopila en un segmento.
- Llamado con un segmento existente:
slice...(difunde, reutiliza el segmento). - Todas las funciones de
fmt.Print*son variadas. - Sólo el último parámetro puede ser variado.