Fork me on GitHub

Golang defer, panic y recover

August 25, 2015

Golang tiene un mecanismo llamado defer que sirve para asegurarnos de que cierto código siempre se ejecutará al finalizar una función

Lo que sucede acá es que second se ejecutará luego de que main haya finalizado. Este mecanismo es útil para realizar tareas de limpieza, como cerrar archivos o conexiones.

f, _ := os.Open(filename)
defer f.Close()

Lo bueno de esto además es que Close queda junto a Open y es más fácil de leer.

Por otro lado tenemos panic que lanza una especie de excepción en tiempo de ejecución. Esta excepción la podemos interceptar con recover y obtener su valor. Acá podemos ver cómo con la ayuda de defer podemos interceptar la llamada a panic

$ go run panic.go 
open /file: permission denied

Y acá hay otro ejemplo un poco más interesante

Calling g.
Printing in g 0
Printing in g 1
Printing in g 2
Printing in g 3
Panicking!
Defer in g 3
Defer in g 2
Defer in g 1
Defer in g 0
Recovered in f 4
Returned normally from f.

Referencias

Golang