Saltar al contenido principal
eLearner.app
Módulo 3 · Lección 3 de 513/50 en el curso~10 min
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

Go
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)    // 10

Sólo el último parámetro puede ser variable:

Go
func log(prefix string, values ...any) { ... }   // ok
// func wrong(...int, suffix string) {}            // ERRORE

Extender una rebanada

Si ya tiene un segmento, puede pasarlo a una función variada con ...:

Go
nums := []int{1, 2, 3}
sum(nums...)         // 6 — espande lo slice nei singoli argomenti

El "..." 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:

Go
// 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

Ejercicio#go.m3.l3.e1
Intentos: 0Cargando...

Defina sum(nums ...int) int que devuelva la suma de todos los argumentos.

Cargando editor...
Mostrar pista

Dentro de la función `nums` tiene el tipo `[]int`.

Solución disponible después de 3 intentos

Ejercicio#go.m3.l3.e2
Intentos: 0Cargando...

Llame a la función de suma existente pasando los números de segmento con `nums...` extendido.

Cargando editor...
Mostrar pista

El `...` va DESPUÉS del nombre del segmento.

Solución disponible después de 3 intentos

Cuestionario#go.m3.l3.e3
Listo

Dentro de `func f(args ...string)`, ¿qué tipo es `args`?

Go
func f(args ...string) {
    _ = args
}
Opciones de respuesta

Resumen

  • ...T como Ú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.