En este capítulo final de funciones, vamos a revisar el uso de funciones “variables” (variadic functions), reciben este nombre por que a estas funciones es posible pasarle un número variable de argumentos siempre que el mismo tipo al que se hace referencia en la firma de la función.

La declaración de estas funciones es realmente sencilla, simplemente hay que preceder el tipo de datos por puntos suspensivos “…”, con lo cual se indica que la función puede ser llamada con cualquier número de argumentos.

La utilidad de estas funciones es que cuando no conocemos la cantidad de argumentos que le estamos pasando a la función.

Seleccionar un argumento de una función variable

Para seleccionar un argumento basta con indicar el índice del argumento.

package main

import "fmt"

func main() {
	funcionVariable("messi", "ramos", "mbape", "dimaria")
}

//al preceder el tipo de dato por ... es posible pasar un número n de argumentos
func funcionVariable(psg...string) {
	fmt.Println(psg[0])//recupera  el valor messi
	fmt.Println(psg[3])//recupera el valor de dimaria
}

Es posible obtener un error de “índice fuera de rango”, si dentro de la función queremos manipular un argumento que no ha sido enviado, por ejemplo si en el ejemplo imprimiéramos psg[4] obtendríamos dicho error.

Pasando múltiples argumentos a la función variable

Ahora veamos como pasar N valores a la función que ya declaramos que acepta N valores de tipo string, utilicemos el mismo ejemplo, solo que ahora llamaremos a la función variable sin pasarle argumentos, pasándole uno y pasándole múltiples:


package main

import "fmt"

func main() {
	
	funcionVariable()
	funcionVariable("messi")
	funcionVariable("messi", "ramos", "mbape", "dimaria")
}

func funcionVariable(s ...string) {
	fmt.Println(s)
}

Enviar Parámetros variables y normales a una función

Es posible combinar el paso de parámetros con declaración normal y con parámetros de función variable, en el siguiente ejemplo en la función pedimos como argumento un parámetro de tipo string y variables de tipo entero.

package main

import "fmt"

func main() {
	//pasamos dos valores al parametro variable
	fmt.Println(calculo("rectangulo", 10, 20))
	//pasamos solo un valor al parametro variable
	fmt.Println(calculo("cuadrado", 10))
}

//esperamos un valor string, y n parametros tipo entero
func calculo(tipo string, lados ...int) int {

	area := 1
	//recorremos los valores del parametro variables
	for _, valor := range lados {
		if tipo == "rectangulo" {
			area *= valor
		} else if tipo == "cuadrado" {
			area = valor * valor
		}
	}
	return area
}

Diferentes tipos de argumentos en una función variable

En este punto nos debemos estar preguntando, ¿una función variable nos permite pasar n parámetros , pero también de distintos valores?, la respuesta es si y para poder hacerlo utilizaremos el tipo interface, el cual es muy útil para trabajar si no conocemos el tipo de dato, a continuación veamos un ejemplo donde pasamos n parámetros de distintos tipos en una función variable.

package main

import (
	"fmt"
	"reflect"
)

func main() {
	//le pasamos a la funcion variable distintos tipos de valores
	//y de distintos tipos de datos,entero,boolean,map...
	funcionVariabble(10, "messi", true, 200.4, []string{"psg", "madrid"},
		map[string]int{"celtics": 12, "bulls": 6})
}

//declarando de tipo interface es posible pasar parametros sin importar el tipo de dato
func funcionVariabble(parametro ...interface{}) {
	//iteramos el parametro e imprimimos su valor y su tipo
	for _, valor := range parametro {
		fmt.Println(valor, "--", reflect.ValueOf(valor).Kind())
	}
}

Con este post terminamos el tema de funciones, esperando les haya sido de utilidad conocer un poco más de las funciones en golang.

Jesus Flores

Ingeniero de Software y Agile Coach

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *