No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Funciones an贸nimas

13/30
Recursos

驴Qu茅 es una funci贸n an贸nima en Go?

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.

驴C贸mo implementamos funciones an贸nimas en Go?

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.

驴Cu谩les son las desventajas de repetir c贸digo con funciones an贸nimas?

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.

驴C贸mo se utilizan funciones an贸nimas con Goroutines?

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.

驴Cu谩ndo es recomendable usar funciones an贸nimas?

El uso de funciones an贸nimas es pr谩ctico en situaciones donde:

  • Necesitamos realizar una operaci贸n sencilla una sola vez.
  • Deseamos aplicar funcionalidad en tiempo de ejecuci贸n sin saturar el espacio de nombres con funciones no reutilizables.
  • En conjunci贸n con Goroutines para manejar procesos concurrentes.

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

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

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()
}