Funciones y Retornos en Go: Uso y Mejores Prácticas
Resumen
¿Cómo optimizar tu código en Go con funciones?
Las funciones son una herramienta fundamental en cualquier lenguaje de programación, y Go no es la excepción. Al utilizarlas, puedes transformar el código repetitivo en uno más limpio, conciso, y fácil de mantener. Además, las funciones no solo favorecen tu trabajo, sino que también facilitan el entendimiento y mejora por otros programadores. En esta sección, exploraremos cómo usar funciones y las funciones anónimas en Go.
¿Cómo definir una función en Go?
Para definir una función en Go, utilizamos la palabra clave func, seguida del nombre de la función y paréntesis que indican si recibe parámetros:
func nombreDeLaFunción(){// Cuerpo de la función}
Aquí algunos aspectos a tener en cuenta:
El nombre de la función debe describir su propósito.
Si el nombre tiene más de una palabra, la segunda y siguientes deben comenzar con mayúscula.
Ejemplo: Imprimir mensajes
Veamos cómo definir una función simple para imprimir mensajes, evitando la repetición de código:
funcimprimirMensaje(mensaje string){ fmt.Println(mensaje)}funcmain(){imprimirMensaje("Hola Mundo")imprimirMensaje("Hola Mundo dos")imprimirMensaje("Hola Mundo tres")}
Al llamar imprimirMensaje, observamos que reutilizamos la misma lógica con diferentes mensajes.
¿Cómo aceptar múltiples parámetros en funciones?
Puedes definir funciones que acepten múltiples parámetros de diferentes tipos:
functripleArgumento(a, b int, c string){ fmt.Println(a, b, c)}
Es una buena práctica en Go combinar parámetros de tipos iguales en una misma declaración.
Ejemplo: Imprimir múltiples tipos
Podemos llamar a tripleArgumento con distintos valores:
tripleArgumento(1,2,"Hola")
Este enfoque permite manejar datos variados de manera eficiente.
¿Cómo hacer que una función retorne valores en Go?
En Go, las funciones pueden retornar valores, lo cual es útil para cálculos o procesamiento de datos que regresarán algún resultado:
funcretornarDoble(valor int)int{return valor *2}
Ejemplo: Retornar un cálculo
Podemos utilizar retornarDoble para calcular y mostrar el doble de un número:
Esta función es sencilla pero demuestra cómo retornar valores desde una función.
¿Cómo manejar múltiples valores de retorno?
Las funciones en Go también pueden retornar múltiples valores, algo que puede ser muy útil en diferentes escenarios:
funcdividir(y, z int)(int,int){ cociente := y / z
resto := y % z
return cociente, resto
}
Ejemplo: Uso de múltiples valores de retorno
cociente, resto :=dividir(10,3)fmt.Println("Cociente:", cociente,"Resto:", resto)
Si no necesitas uno de los valores, puedes omitirlo utilizando el identificador en blanco _:
_, resto :=dividir(10,3)
¿Cuáles son las prácticas recomendadas al usar funciones en Go?
Nombres claros y descriptivos: Elige nombres que reflejen el propósito de la función.
Evita repeticiones: Utiliza funciones para encapsular lógica repetitiva.
Parámetros y retornos claros: Declara de forma óptima los tipos de datos para claridad y eficiencia.
Evita variables no usadas: Usa el identificador en blanco _ para ignorar valores que no necesitas.
Adentrándote en el mundo de las funciones en Go, no solo mejorarás tus habilidades como programador, sino que también contribuirás a crear código más eficiente y sostenible. ¡Continúa practicando y experimentando con funciones para dominar este poderoso concepto en Go!
Podemos ahorrarnos escribir el tipo de dato varias veces simplemente con poner poner una coma, así:
func areaTrapezoide(B, b, h float64) float64{return h *(bMy + bMn)/2}
Como para variar un poco quise hacer la problemática del inicio en una sola fila ^^
Una observación: En el titulo se mencionan las funciones anónimas pero no se habla de ellas :)
Practicando con Go y mi ingles :D
package main
import"fmt"//Creando funcionesfunc calculateRectangleArea(b, h int){rectangleArea:= b * h
fmt.Println("El área del rectángulo es:", rectangleArea)}func calculateTrapezeArea(b1, b2, h1 float64){trapezeArea:=(b1 + b2)* h1 /2 fmt.Println("El área del trapecio es:", trapezeArea)}func calculateCircleArea(r float64){const pi float64 =3.14circleArea:= pi *(r * r) fmt.Println("El área del circulo es:", circleArea)}//En main epezará a correr en cónsolafunc main(){calculateRectangleArea(5,10)calculateTrapezeArea(15,12,6)calculateCircleArea(10)}
*Hice unos cambios pequeños no porque estuviera mal (de hecho está perfecto), sino como questión de práctica:
package main
import "fmt"
// Funciones para calculo del área de algunas figuras geométricas
func computeRectangleArea(b, h int) {
rectangleArea := b * h
fmt.Println("El área del rectángulo es:", rectangleArea)
}
func computeTrapezoidArea(B, b, h float64) {
trapezoidArea := (B + b) * h / 2
fmt.Println("El área del trapecio es:", trapezoidArea)
}
func computeCircleArea(r float64) {
const pi float64 = 3.1415922653589793
circleArea := pi * (r * r)
fmt.Println("El área del circulo es:", circleArea)
}
En Python, guardar una variable con guion bajo es meramente una convención para que cuando otro programador esté trabajando sobre el mismo código, sepa que el valor de dicha variable no tiene importancia. Dado que si podemos hacer algo como sin tener alguna clase de error:
names =("Gopher","Go")value1, _ = names
print("El valor de guion es ", _) # ImprimiráGo
Extra:
Go es tan buena onda que te permite usar varias veces el guion bajo sobre la misma expresión:
value1, _,_:=threeValuesReturn()
Hola cuales eran las funciones anonimas?
Hola:wave:
Una función anónima es una función definida internamente dentro de un bloque de código, y que no tiene identificador o nombre. Este tipo de funciones no son reutilizables como paquetes, siendo utilizadas únicamente dentro del bloque de código en el que son declaradas.
El siguiente código declara una función anónima dentro de la función main(), la cual sólo tiene visibilidad dentro de esta función.
package main
import"fmt"func main(){// Ejemplo basico de funcion anonimavar num int =0incrementar:=func() int { num++return num
} fmt.Println("Num: ", num)// 0 fmt.Println("Num: ",incrementar())// 1 fmt.Println("Num: ",incrementar())// 2}
Te sugiero darle un vistazo a esta documentación, es muy buena. Y sobre todo, esta sección en especial responde a tu duda:
Ya en este punto del cusro la verdad no me gusta que trbajamos sobre el mismo archivo main.go.
es como si se perdiera la trazabilidad de lo que se ha echo anteriormente, como puedo ir modificando mi estrutura de archivos de forma tal de que vaya consignado todo lo aprendido.
Ese guión bajo vale su peso en oro
🐱💻 Funciones para determinarárea de un triangulo, trapecio y circulo.
package main
import"fmt"funcrArea(base , height int)int{return base * height
}functArea(higher , less, size int)int{return(higher + less)* size /2}funccArea(radio, pi float64)float64{return(radio * radio)* pi
}funcmain(){ base :=80 height :=40 fmt.Println("Area del rectangulo: ",rArea(base, height)) higher :=90 less :=45 size :=55 fmt.Println("Area del trapecio: ",tArea(higher, less, size)) radio :=45.5const pi =3.14 fmt.Println("Area del circulo: ",cArea(radio, pi))}
Casi estoy seguro que es mala práctica devolver más de dos valores, pero si devolvemos más de un valor hay que usar _ por cada uno de los valores a ignorar.
¿No existe una forma más sencilla?
Hola Fernando! Como bien dices, devolver más de dos valores puede ser indicador de que una función hace más de lo que debería. Sin embargo, hay casos en los que puede ser necesario y hasta bueno devolver más de dos valores. Incluso la librería estándar de Go lo hace en ocasiones, como en este método de el tipo time.Time:
Es un ejemplo muy sencillo pero creo que demuestra que en ocasiones es necesario.
Respondiendo a la pregunta, no hay otra forma de ignorar valores que no sea el _
Cual es la diferente entre funciones y funciones anonimas
Se que es muy tarde pero:
Una función normal la puedes usar en cualquier parte de tu código.
Una función anónima es usada para cosas que solo la ocupas de forma muy limitada. Es decir, solo la ocupas una sola vez y tal vez no vale la pena declararla en el scope global.
Como puedo correr mi codigo distribuido en archivos individuales?
cuanto intento correr
go run file.go
obtengo
runtime.main_main·f: function main is undeclared in the main package
Hola!
Al parecer el error es porque no has declarado correctamente la función main
¿Puedes poner el código?
Reto :)
package main
import("fmt""math")// Calcular area circulofunc areaCirculo(diametro float64){const pi float64 = math.Pivar area_circulo = pi *(diametro * diametro /4) fmt.Printf("Area circulo: %.2f \n", area_circulo)}//Calcular area rectangulofunc areaRectangulo(largo, ancho float64){var area_rectangulo = largo * ancho
fmt.Printf("Area rectangulo: %.2f \n", area_rectangulo)}// Calcular area trapreciofunc areaTraprecio(base1, base2, altura float64){var area_trapecio = altura *((base1 + base2)/2) fmt.Printf("Area trapecio: %.2f \n", area_trapecio)}func main(){areaCirculo(5)areaRectangulo(25,50)areaTraprecio(6,3,4)/*
Area circulo: 19.63
Area rectangulo: 1250.00
Area trapecio: 18.00
*/}
package main
import("fmt""math")func areaRectangulo(base, altura float64) float64 {return base * altura
}func areaTrapecio(baseMenor,baseMayor,altura float64)float64{return((baseMayor+baseMenor)*altura)/2}func areaCirculo(radio float64)float64{return math.Pi*(radio*radio)}func main(){// Area de rectangulorectangulo:=areaRectangulo(5.0,10.0) fmt.Println("El area del rectangulo es de:",rectangulo)// Area de trapeciotrapecio:=areaTrapecio(10.0,7.0,5.0) fmt.Println("El area del trapecio es de:",trapecio)// Area de circulocirculo:=areaCirculo(5.0) fmt.Println("El area del circulo es de:",circulo)}
package main
import("fmt""math")// rectangleArea calculates the area of a rectangle.func rectangleArea(base, height float64) float64 {return base * height
}// trapezoidArea calculates the area of a trapezoid.func trapezoidArea(base1, base2, height float64) float64 {return(base1 + base2)* height /2}// circleArea calculates the area of a circle.func circleArea(radius float64) float64 {return math.Pi* radius * radius
}func main(){base:=12.0height:=14.0upperBase:=20.0radius:=2.0 fmt.Printf("Área del rectángulo: %.2f\n",rectangleArea(base, height)) fmt.Printf("Área del trapecio: %.2f\n",trapezoidArea(base, upperBase, height)) fmt.Printf("Área del círculo: %.2f\n",circleArea(radius))}
Que sucede si al escribir una variable escribo lo siguiente _hola? toma como un valor a omitir esa variable?
Hola Jonathan, si declaras una variable que empiece con guion bajo no tiene problema, y será una variable como cualquier otra, las variables en Go pueden empezar por una letra o por un guion bajo.
Por ejemplo, de acuerdo al ejercicio de Osmandi:
// Nombres válidos// Empiezan con una letra o un guion bajo '_'_miVariable1,miVariable2:=doubleReturn(2)fmt.Println("_miVariable1: ", _miVariable1)// Nombres no válidos// Aquellos que empiezan con carácteres especiales exceptuando el '_' guion bajo o con números
Como puedo mi codigo distribuido en archivos individuales?
cuanto intento correr
go run file.go
obtengo
runtime.main_main·f: function main is undeclared in the main package
Fijate si en tus archivos tienes package main y la funcion main, me paso igual y se solucionó teniando ambos en cada archivo
package main
import("fmt""math")func rectangleArea(length, height float64)(float64){return length * height
}func trapeziumArea(majorBase, minorBase, height float64)(float64){return((majorBase + minorBase)/2)* height
}func circleArea(radius float64)(float64){return math.Pi* radius * radius
}func main(){ fmt.Println("The area of the rectangle is:",rectangleArea(10,15)) fmt.Println("The area of the trapezium is:",trapeziumArea(50,20,30)) fmt.Println("The area of the circle is:",circleArea(35))}