typestar

defer y limpieza en Go

Limpieza garantizada, y cómo devolver un error desde un defer.

func copyFile(src, dst string) (err error) {
    in, err := os.Open(src)
    if err != nil {
        return fmt.Errorf("open %s: %w", src, err)
    }
    defer in.Close()

    out, err := os.Create(dst)
    if err != nil {
        return err
    }
    defer func() {
        if cerr := out.Close(); err == nil {
            err = cerr
        }
    }()
    _, err = out.ReadFrom(in)
    return err
}

Cómo funciona

  1. defer corre cuando la función retorna, en orden LIFO.
  2. Un resultado con nombre deja que una clausura diferida asigne el error.
  3. %w envuelve la falla con contexto.

Palabras clave y builtins usados aquí

El intento, en números

Líneas
19
Caracteres a escribir
311
Tokens
102
Ritmo de tres estrellas
105 tpm

Al ritmo de tres estrellas de 105 tokens por minuto, este intento toma unos 58 segundos.

Escribe este fragmento

Paso 1 de 4 en defer, panic y recover; paso 10 de 15 en Errores.

← Anterior Siguiente →