Contenido del curso

Estructuras de Datos y Funciones

Funciones variadic en Go con tres puntos

Resumen

Las funciones variadic en Go te permiten recibir una cantidad indefinida de parámetros del mismo tipo dentro de una sola función, sin tener que duplicar código para cada caso. Si alguna vez creaste una función suma y luego una sumaLarga para más argumentos, esta es la solución que te ahorra líneas y mantiene tu código limpio.

¿Qué es una función variadic en Go y por qué deberías usarla?

Una función variadic acepta un número variable de argumentos del mismo tipo. En lugar de fijar dos, tres o cinco parámetros, declaras uno solo precedido por tres puntos ... y Go se encarga de tratarlo como un slice internamente.

El ejemplo más conocido lo usas todos los días: fmt.Println. Puedes pasarle un solo string como "Hello, world", o combinarlo con variables como name y age, y la función responde igual de bien con uno, dos o cinco elementos.

¿Qué significa el operador ... en Go? Indica que el parámetro acepta cero o más valores del tipo declarado. Internamente, Go los empaqueta como un slice que puedes recorrer con for range.

¿Cómo se declara una función variadic paso a paso?

La sintaxis es directa: declaras el parámetro con tres puntos antes del tipo. Así le dices al compilador que ese argumento puede recibir cualquier cantidad de valores.

Mira cómo se ve una función sum que acepta enteros indefinidos:

go func sum(numbers ...int) { fmt.Println(numbers) total := 0 for _, number := range numbers { total = total + number } fmt.Println("La suma es", total) }

Dentro de la función, numbers se comporta como un slice. Por eso puedes recorrerlo con for range, ignorando el índice con el guion bajo _ y acumulando cada valor en total.

¿Cómo invocas una función variadic con valores sueltos?

La llamas como cualquier función, pero pasando los argumentos separados por coma. No hay un límite fijo: puedes mandar dos, tres o los que necesites.

  • sum(1, 2) devuelve la suma 3.
  • sum(1, 2, 3) devuelve 6.
  • sum(10, 20, 30, 40) devuelve 100.

Cada llamada usa la misma función, sin sobrecargas ni versiones alternativas.

¿Cómo paso un array o slice a una función variadic?

Aquí viene lo interesante. Si ya tienes un slice con los valores, no necesitas extraerlos uno por uno. Usas el operador ... al momento de la llamada para expandirlos.

go numbers := []int{1, 2, 3, 4, 5} sum(numbers...)

Esa expansión le dice a Go: "toma cada elemento del slice y pásalo como argumento individual". El resultado de ese ejemplo es 15.

¿Cuándo conviene usar una función variadic en tus proyectos?

La pista está en cuántas versiones de la misma función estás creando. Si te encuentras escribiendo suma, sumaLarga y luego sumaMasLarga, es señal de que necesitas una variadic.

¿Cuál es la diferencia entre una función normal y una variadic? La normal exige una cantidad exacta de parámetros. La variadic acepta desde cero hasta los que quieras, todos del mismo tipo, agrupados como slice.

Algunos escenarios donde brillan:

  • Funciones de logging o impresión donde no sabes cuántos valores vas a mostrar.
  • Operaciones matemáticas como sumas, promedios o máximos sobre cantidades dinámicas.
  • Constructores que reciben una lista opcional de configuraciones.

El propio fmt.Println es la prueba viva de cuán versátil resulta esta característica: una sola función adaptándose a prácticamente cualquier entrada.

¿Qué pasa dentro de la función cuando recibes los parámetros?

Go convierte automáticamente los argumentos en un slice del tipo declarado. Eso significa que puedes usar todas las herramientas que ya conoces: len() para contar, for range para iterar, indexación directa, etc.

En el ejemplo de sum, el for _, number := range numbers ignora el índice con _ (el famoso guion bajo para saltar el primer valor del rango) y acumula cada número en total. Al final, fmt.Println("La suma es", total) imprime el resultado.

Practica creando tus propias variadic: una que concatene strings, otra que encuentre el valor máximo, una más que reciba structs. Cada vez que reduzcas funciones duplicadas, vas a sentir el ahorro real en tu base de código.

¿Ya identificaste en tu proyecto actual alguna función que podrías refactorizar como variadic? Cuéntame en los comentarios cuál fue y cuántas líneas te ahorraste.