Volver a la página principal
lunes 21 octubre 2024
5

Cómo usar defer en Go

El uso de la palabra clave defer en Go permite retrasar la ejecución de una función hasta que la función que la contiene termine su ejecución. Esto es útil para asegurarse de que ciertas acciones, como cerrar archivos o liberar recursos, siempre se ejecuten, incluso si ocurre un error o se retorna antes de lo esperado.

¿Qué es defer en Go?

defer es una instrucción que pospone la ejecución de una función o una llamada a una función hasta que la función envolvente (la que contiene el defer) haya completado su ejecución. Las funciones que se "difieren" se ejecutan en orden LIFO (Last In, First Out), es decir, la última función diferida será la primera en ejecutarse.

Sintaxis básica de defer

La sintaxis es sencilla. Basta con escribir la palabra clave defer seguida de la función que deseas ejecutar al final.

package main

import "fmt"

func main() {
    defer fmt.Println("Esto se ejecutará al final")
    fmt.Println("Esto se ejecuta primero")
}

En este ejemplo, el segundo Println se ejecuta primero, y la llamada diferida con defer se ejecuta al final, justo antes de que finalice la función main.

Usos comunes de defer

Cerrar archivos

Un uso muy común de defer es asegurarse de que los archivos o conexiones se cierren correctamente, incluso si ocurre un error durante la ejecución.

package main

import (
    "fmt"
    "os"
)

func main() {
    file, err := os.Open("archivo.txt")
    if err != nil {
        fmt.Println("Error al abrir el archivo:", err)
        return
    }
    defer file.Close()  // El archivo se cerrará cuando main termine

    // Leer o trabajar con el archivo aquí
    fmt.Println("Archivo abierto exitosamente")
}

En este caso, file.Close() se ejecutará automáticamente al final de la función main, garantizando que el archivo se cierre incluso si ocurre un error.

Liberar recursos

Otra aplicación es la liberación de recursos como conexiones de red, mutexes o manejo de memoria.

package main

import (
    "fmt"
    "sync"
)

func main() {
    var mu sync.Mutex
    mu.Lock()
    defer mu.Unlock()  // Asegura que se desbloquee al final de la función

    fmt.Println("Mutex bloqueado")
    // Hacer algo con el recurso protegido
}

Ejemplos con múltiples defer

Si tienes varias instrucciones defer, se ejecutarán en orden inverso a como fueron declaradas.

package main

import "fmt"

func main() {
    defer fmt.Println("Tercero")
    defer fmt.Println("Segundo")
    defer fmt.Println("Primero")
}

Salida:

Primero
Segundo
Tercero

Referencia oficial

Para obtener más información sobre defer, consulta la documentación oficial de Go.

Etiquetas:
go
Compartir:
Creado por:
Author photo

Jorge García

Fullstack developer