• 16/09/2024 8:04 PM

Funciones Diferidas (Defer)

porJesus Flores

Ago 19, 2021

Go cuenta con una instrucción especial llamada defer que ejecuta una llamada a una función para ejecutarse después de que se complete la función.
Veamos un ejemplo:


package main
import "fmt"
func primeraLlamada() {
	fmt.Println("Primera")
}
func segundaLlamada() {
	fmt.Println("Segunda")
}
func main() {
	defer segundaLlamada()
	primeraLlamada()
}

Esta ejecución nos dará como resultado:
Primera
Segunda

El uso de la función defer resulta útil para operaciones como abrir y cerrar archivos, conectar y desconectar de bases de datos o bloquear y desbloquear con esto nos aseguramos que los recursos sean liberados.
Es recomendable colocar la instrucción de liberar el recurso inmediatamente después de adquirir el recurso. A continuación veremos un ejemplo de apertura de un archivo:

func leerEscribir() bool {
file.Open("elarchivo")
defer file.Close()   //agregamos el método de cierre file.Close() a la lista defer
//hacemos algo con el archivo
if fallaPorX{
return false   // Close() se ejecutará automáticamente después del return
}

if fallPorY{
return false   // aquí sucederá lo mismo se ejecutará close después del return
}

return true   // aquí de igual modo se ejecutará el close
}

Algunas ventajas importantes de usar defer

  • Las funciones diferidas se ejecutan incluso si obtenemos un panic en tiempo de ejecución.
  • Es posible agregar varias funciones a la “lista diferida”, como veremos en el siguiente ejemplo.
  • Las funciones diferidas se ejecutan en orden LIFO, es decir la ultima función agregada a defer será la primera en ejecutarse, por lo cual la salida del ejemplo será 2,1,0.

	for i := 0; i < 3; i++ {
		defer fmt.Printf("%d ", i)
	}

por 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 *