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
defercorre cuando la función retorna, en orden LIFO.- Un resultado con nombre deja que una clausura diferida asigne el error.
%wenvuelve la falla con contexto.
Palabras clave y builtins usados aquí
defererrorfuncifreturnstring
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.
Paso 1 de 4 en defer, panic y recover; paso 10 de 15 en Errores.