Go cuenta con una instrucción especial llamada defer que ejecuta una llamada a una función para ejecutarse después de que se complete la función.
Veamos un ejemplo:
package main import "fmt" func primeraLlamada() { fmt.Println("Primera") } func segundaLlamada() { fmt.Println("Segunda") } func main() { defer segundaLlamada() primeraLlamada() }
Esta ejecución nos dará como resultado:
Primera
Segunda
El uso de la función defer resulta útil para operaciones como abrir y cerrar archivos, conectar y desconectar de bases de datos o bloquear y desbloquear con esto nos aseguramos que los recursos sean liberados.
Es recomendable colocar la instrucción de liberar el recurso inmediatamente después de adquirir el recurso. A continuación veremos un ejemplo de apertura de un archivo:
func leerEscribir() bool { file.Open("elarchivo") defer file.Close() //agregamos el método de cierre file.Close() a la lista defer //hacemos algo con el archivo if fallaPorX{ return false // Close() se ejecutará automáticamente después del return } if fallPorY{ return false // aquí sucederá lo mismo se ejecutará close después del return } return true // aquí de igual modo se ejecutará el close }
Algunas ventajas importantes de usar defer
- Las funciones diferidas se ejecutan incluso si obtenemos un panic en tiempo de ejecución.
- Es posible agregar varias funciones a la “lista diferida”, como veremos en el siguiente ejemplo.
- Las funciones diferidas se ejecutan en orden LIFO, es decir la ultima función agregada a defer será la primera en ejecutarse, por lo cual la salida del ejemplo será 2,1,0.
for i := 0; i < 3; i++ { defer fmt.Printf("%d ", i) }