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.
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.
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
.
defer
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.
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
}
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
Para obtener más información sobre defer
, consulta la documentación oficial de Go.
Jorge García
Fullstack developer