sábado, 20 de octubre de 2018

Funciones variádicas en Go

En Go existe un tipo de funciones denominadas "variádicas" (del inglés variadic functions, de las que no hay traducción al castellano). El concepto de este tipo de funciones se refiere a que permiten cualquier número de parámetros como entrada.


Sintaxis

La sintaxis de una función variádica es la siguiente:

func <nombre_función>(<nombre_parámetro>... <tipo>) {
   <código_función>
}

En apariencia, la sintaxis es muy similar a la de una función normal. Sin embargo, al indicar tres puntos estamos indicando que a partir de ahí podemos pasar tantos parámetros como queramos, siempre que sean del mismo tipo.

Esto no restringe a que la función sólo permita este parámetro, pues podemos usar diferentes parámetros normales. La limitación está en que los parámetros normales han de pasarse en primer lugar, y que el parámetro variádico sólo puede ser uno y ser el último.

Ejemplo

El siguiente código muestra un ejemplo de función variádica, en la cual pasamos un primer parámetro que es el factor multiplicador, y una lista de números variable, los cuales serán multiplicados por la función:

package main

import "fmt"

func main() {
   multiplicador(2, 10, 20, 25, 36, 47)
}

func multiplicador(factor int, valores ...int) {
   for indice, valor := range valores {
      fmt.Printf("Indice %v > %v x %v = %v\n", 
         indice, valor, factor, valor*factor)
   }
}

La función main() es la función con la que arranca la aplicación. El primer parámetro (2) es el factor multiplicador. El resto de parámetros son los valores por los que se va a multiplicar por el factor. Esta lista de valores es la que puede ser variable (de 1 a n valores).

La función multiplicador() tiene dos parámetros:

  • factor: Parámetro normal. Permite un entero como factor multiplicador
  • valores...: Parámetro variádico. Permite tantos enteros como queramos multiplicar por factor

Internamente, el parámetro valores será un slice o array variable de números enteros. Por ello, el bucle for es recorrido gracias al iterador range, y de cada valor del array obtendrá su índice y su valor (que se guardan en las variables con el mismo nombre).

Dentro de bucle, usaremos la función Printf() del paquete estándar de entrada y salida fmt. Como primer parámetro pasamos una cadena con la plantilla de valores a imprimir en pantalla. El verbo de plantilla %v, indica que será reemplazado por un valor en el formato por defecto. Esto significa que si el valor es un entero se visualizará como entero, si en un número decimal se visualizará como tal, si es una cadena se visualizará como cadena, si es un tipo boolean como valor booleano.

Después de la cadena de plantilla, se especifican las expresiones a visualizar, una por cada verbo de plantilla especificado en la cadena. En este caso será, por orden: la plantilla, el valor procesado en ese momento, el factor multiplicador, y la multiplicación del valor por el factor. Finalmente, con el código \n imprimimos un fin y salto de línea.

Como curiosidad, cabe destacar que la función Printf es también una función variádica.

Ejecución del código

Guardamos el código en un archivo llamado variadic.go. A continuación, desde la consola o terminal del sistema operativo a accedemos al directorio en donde se encuentra este archivo, y lo ejecutamos con el siguiente comando:

$ go run variadic.go
Indice 0 > 10 x 2 = 20
Indice 1 > 20 x 2 = 40
Indice 2 > 25 x 2 = 50
Indice 3 > 36 x 2 = 72
Indice 4 > 47 x 2 = 94

Enlaces de interés

No hay comentarios:

Publicar un comentario