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.