Go by Example: Defer

Defer se utiliza para asegurar que una llamada a función se realice más tarde en la ejecución de un programa, generalmente para fines de limpieza. defer se usa a menudo donde, por ejemplo, ensure y finally se utilizarían en otros lenguajes.

package main
import (
    "fmt"
    "os"
)

Supongamos que queremos crear un archivo, escribir en él, y luego cerrarlo cuando hayamos terminado. Así es como podríamos hacerlo con defer.

func main() {

Inmediatamente después de obtener un objeto de archivo con createFile, diferimos el cierre de ese archivo con closeFile. Esto se ejecutará al final de la función que lo encierra (main), después de que writeFile haya terminado.

    f := createFile("/tmp/defer.txt")
    defer closeFile(f)
    writeFile(f)
}
func createFile(p string) *os.File {
    fmt.Println("creating")
    f, err := os.Create(p)
    if err != nil {
        panic(err)
    }
    return f
}
func writeFile(f *os.File) {
    fmt.Println("writing")
    fmt.Fprintln(f, "data")
}

Es importante verificar si hay errores al cerrar un archivo, incluso en una función diferida.

func closeFile(f *os.File) {
    fmt.Println("closing")
    err := f.Close()
    if err != nil {
        fmt.Fprintf(os.Stderr, "error: %v\n", err)
        os.Exit(1)
    }
}

Ejecutar el programa confirma que el archivo se cierra después de haber sido escrito.

$ go run defer.go
creating
writing
closing

Siguiente ejemplo: Recover.