Tambi茅n se pueden hacer funciones que an贸nimas que reciben par谩metros. Solamente hay que agregar el valor del mismo en los par茅ntesis del final
z := func(n int) int {
return n * 2
}(5)
Introducci贸n
Caracter铆sticas esenciales de Go
Qu茅 aprender谩s y qu茅 necesitas saber
Repaso general: variables, condicionales, slices y map
Repaso general: GoRoutines y apuntadores
Programaci贸n orientada a objetos
驴Es Go orientado a objetos?
Structs vs. clases
M茅todos y funciones
Constructores
Herencia
Interfaces
Aplicando interfaces con Abstract Factory
Implementaci贸n final de Abstract Factory
Funciones an贸nimas
Funciones variadicas y retornos con nombre
Go Modules
C贸mo utilizar los Go modules
Creando nuestro m贸dulo
Testing
Testing
Code coverage
Profiling
Testing usando Mocks
Implementando Mocks
Concurrencia
Unbuffered channels y buffered channels
Waitgroup
Buffered channels como sem谩foros
Definiendo channels de lectura y escritura
Worker pools
Multiplexaci贸n con Select y Case
Proyecto: servidor con worker pools
Definiendo workers, jobs y dispatchers
Creando web server para procesar jobs
Conclusi贸n
Contin煤a con el Curso de Go Avanzado
No tienes acceso a esta clase
隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera
Las funciones an贸nimas, tambi茅n conocidas como funciones sin nombre, son un concepto interesante en programaci贸n y Go no es la excepci贸n al implementarlas. Estas funciones se crean para ser utilizadas una sola vez y no se pueden referenciar de nuevo, pues carecen de un nombre. Este enfoque es 煤til cuando estamos absolutamente seguros de que la funcionalidad solo se necesita ejecutar una 煤nica vez.
Veamos c贸mo se utiliza el concepto de funciones an贸nimas en el c贸digo Go. Primero, crearemos un archivo llamado functions.go
. Luego, dentro de este archivo, definimos el paquete principal y una funci贸n main
. Se propone crear una variable x
e implementar una funci贸n an贸nima que duplique su valor.
package main
func main() {
x := 5
y := func() int {
return x * 2
}()
println(y)
}
En este bloque, la funci贸n para obtener el doble del valor de x
se declara e inmediatamente se invoca. La funci贸n an贸nima se asigna a una variable y
, que se imprime a continuaci贸n. Sin embargo, si necesitamos reutilizar esta funci贸n con otro valor, corremos el riesgo de duplicar c贸digo.
El ejemplo anterior nos mostr贸 que si intentamos reutilizar el c贸digo de la funci贸n con otra variable, estar铆amos repitiendo c贸digo, lo cual va en contra del principio DRY (Don't Repeat Yourself). Este principio promueve evitar la duplicaci贸n en el dise帽o de software.
package main
func main() {
x := 5
y := func() int {
return x * 2
}()
println(y)
z := 10
doubleZ := func() int {
return z * 2
}()
println(doubleZ)
}
Aunque el enfoque puede funcionar, no es una buena pr谩ctica. Repetir铆amos el mismo bloque de c贸digo en lugar de abstraerlo en una funci贸n.
Otra utilidad clave de las funciones an贸nimas es en la ejecuci贸n concurrente con Goroutines en Go. Las funciones an贸nimas nos permiten realizar procesos largos sin bloquear el flujo general del programa.
package main
import (
"fmt"
"time"
)
func main() {
done := make(chan bool)
go func() {
fmt.Println("Iniciando la funci贸n...")
time.Sleep(5 * time.Second)
fmt.Println("Funci贸n terminada.")
done <- true
}()
<-done
fmt.Println("Programa completado.")
}
En este ejemplo, hemos usado una funci贸n an贸nima para simular un proceso largo que espera 5 segundos antes de finalizar. Esto demuestra la potencia de las funciones an贸nimas al permitirnos ejecutar c贸digo de manera concurrente usando Goroutines.
El uso de funciones an贸nimas es pr谩ctico en situaciones donde:
Sin embargo, es crucial recordar que contar con bloques de c贸digo duplicado complica el mantenimiento del mismo y no es recomendado. Por lo tanto, el dise帽o en Go debe tener en cuenta el equilibrio entre funcionalidad, simplicidad y reutilizaci贸n.
隆Sigue explorando y practicando para afianzar tu conocimiento en Go y sus diversas herramientas! La pr谩ctica constante y el aprendizaje continuo son claves para un desarrollo exitoso en la programaci贸n.
Aportes 6
Preguntas 2
Tambi茅n se pueden hacer funciones que an贸nimas que reciben par谩metros. Solamente hay que agregar el valor del mismo en los par茅ntesis del final
z := func(n int) int {
return n * 2
}(5)
package main
import (
"fmt"
"time"
)
// Funciones an贸nimas
func main() {
func() {
println("Hello")
}()
x := 5
y := func() int {
return x * 2
}()
fmt.Println(y)
c := make(chan int)
go func() {
fmt.Println("Starting function")
time.Sleep(2 * time.Second)
fmt.Println("Finishing function")
c <- 1
}()
fmt.Println(<-c)
}
un peque帽o aporte relacionado a los antivirus, en caso alguien llegase a tener Kaspersky, Avast, entre otros, al momento de querer correr el archivo functions.go le arojara un falso positivo de Troyano, la soluci贸n m谩s f谩cil es cambiarle el nombre de functions.go a main.go como se ven铆a trabajando en los videos anteriores, y no habr谩 problemas al ejecutar el c贸digo
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.
Una soluci贸n para no definir la funci贸n an贸nima dos veces, es declarandola pero no invocarla con los () al final, con esto podemos llamarla m谩s adelante con la variable
package main
import "fmt"
func main() {
x := 5
y := func(num int) int {
return num * 2
}
z := 8
fmt.Println(y(x))
fmt.Println(y(z))
}
C贸digo de la clase con comentarios explicando:
package functions
import (
"fmt"
"time"
)
// anon func's are not very recommended for DRY purposes. Only use it when it is necessary.
func anon() {
x := 5
// Anonymous func 1
y := func(x int) int {
return x * 2
}
fmt.Println("y anon func: ", y(x))
// Anonymous func 2 (it calls directly the param and calls itself)
z := func() int {
return x * 2
}()
fmt.Println("y anon func: ", z)
// 3rd Anonymous way: lambda Goroutine in a channel
// Create channel for blocking Gorouting until msg arrives
c := make(chan int)
// anon Goroutine
go func() {
// Exec func logic in Goroutine
fmt.Println("Starting Goroutine anon func...")
time.Sleep(1 * time.Second)
fmt.Println("Goroutine ended")
// Send int to c channel
c <- 1
}() // calls itself
// Waits until receiving the msg in c channel
<-c
}
func Functions() {
anon()
}
驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?