Introducción
La declaración defer se utiliza para retrasar la ejecución de una función hasta que la función envolvente devuelve. A menudo se utiliza para garantizar que se realice alguna limpieza después de que una función se complete, independientemente del camino seguido para llegar allí.
Defer
En este laboratorio, debes utilizar defer para crear un archivo, escribir en él y luego cerrarlo cuando hayas terminado.
- La función
createFiledebe crear un archivo con la ruta dada y devolver un puntero al archivo. - La función
writeFiledebe escribir la cadena "data" en el archivo. - La función
closeFiledebe cerrar el archivo y comprobar si hay errores.
## Ejecutar el programa confirma que el archivo se cierra
## después de ser escrito.
$ go run defer.go
creando
escribiendo
cerrando
A continuación está el código completo:
// _Defer_ se utiliza para garantizar que una llamada a una función se
// realice más tarde en la ejecución de un programa, por lo general con
// fines de limpieza. `defer` se utiliza a menudo en 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. Aquí está cómo 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 envolvente (`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("creando")
f, err := os.Create(p)
if err!= nil {
panic(err)
}
return f
}
func writeFile(f *os.File) {
fmt.Println("escribiendo")
fmt.Fprintln(f, "data")
}
func closeFile(f *os.File) {
fmt.Println("cerrando")
err := f.Close()
// Es importante comprobar si hay errores al cerrar un
// archivo, incluso en una función diferida.
if err!= nil {
fmt.Fprintf(os.Stderr, "error: %v\n", err)
os.Exit(1)
}
}
Resumen
En este laboratorio, aprendiste cómo utilizar defer para garantizar que una llamada a una función se realice más tarde en la ejecución de un programa, por lo general con fines de limpieza. También aprendiste cómo crear un archivo, escribir en él y luego cerrarlo utilizando defer.