🥇 Aplazar funciones con Defer

🍿 ¿En qué consiste la sentencia “defer”?

Defer es una característica que permite que Go aplace la ejecución de una función. Esto puede ser por ejemplo cuando otra función termina de ejecutarse.

El aplazamiento de funciones es generalmente utilizado para realizar tareas de limpieza, una vez que se han completado las actividades a realizar por parte del algoritmo, como cerrar conexiones a base de datos, borrar archivos temporales, limpiar el cache, liberar la memoria, etc.

Supongamos ahora que deseamos conectarnos a la base de datos, y queremos que después de todas las operaciones se realice automáticamente la desconexión, independientemente del flujo de trabajo que el algoritmo siga.

🍿 Ejemplo del uso de la sentencia “defer”

package main

import "fmt"

func desconectar() {
    fmt.Println("Se ha desconectado de la base de datos")
}

func leer() {
    fmt.Println("Se han leido los registros de la base de datos")
}

func actualizar() {
    fmt.Println("Se han actalizado registros de la base de datos")
}

func conectar() {
    fmt.Println("Se ha conectado a la base de datos")
}

func main() {
    conectar()
    defer desconectar()
    leer()
    actualizar()
}

🍿 Descripción del ejemplo del uso de la sentencia “defer”

En este caso hemos creado 4 funciones…

  • conectar
  • leer
  • actualizar
  • desconectar

El orden en el que se invocan las funciones es el siguiente…

conectar()
defer desconectar()
leer()
actualizar()

Debido a que desconectar() esta precedido de defer, esta automáticamente se disparará hasta el final de la ejecución de las demás funciones. Si ejecutamos el programa nos entregará lo siguiente.

Se ha conectado a la base de datos
Se han leido los registros de la base de datos
Se han actalizado registros de la base de datos
Se ha desconectado de la base de datos

Se pueden utilizar múltiples defer, pero hay que tomar en cuenta que el orden en el que se ejecuten es el inverso en el que se definan. Es decir el primero que se defina sera el ultimo, el segundo el penúltimo, el tercero el antepenúltimo, etc.