Junior
¿Qué concepto se implementa con la construcción defer en el lenguaje Go?
sobes.tech AI
Respuesta de la IA
La construcción defer implementa el concepto de ejecución diferida de funciones. La función diferida se ejecuta justo antes de que la función que la contiene finalice.
Puntos clave:
- Momento de ejecución: La función diferida se ejecuta al final de la función principal, incluso si ocurre un pánico o una excepción.
- Pila: Las llamadas diferidas forman una pila. La última llamada diferida será ejecutada primero (LIFO).
- Captura de variables: Los argumentos de la función diferida se evalúan en el momento de la declaración de
defer, no en el momento de la ejecución.
Ejemplos de uso típico:
- Cierre de archivos, conexiones de red, mutexes.
- Restauración del estado (por ejemplo, después de cambiar variables globales o banderas).
- Medición del tiempo de ejecución.
// Ejemplo de uso de defer para cerrar un archivo
func readFile(filename string) error {
f, err := os.Open(filename)
if err != nil {
return err
}
defer f.Close() // El archivo se cerrará antes de salir de la función
// Lectura del archivo...
return nil
}
// Ejemplo de pila de llamadas defer
func process() {
defer fmt.Println("Primero en la pila")
defer fmt.Println("Segundo en la pila")
defer fmt.Println("Tercero en la pila") // Se ejecutará al final
fmt.Println("Procesando...")
}
Llamadas diferidas con argumentos:
// Ejemplo de captura del valor de una variable en el momento de la declaración de defer
func demonstrateDeferArgEval() {
i := 0
defer fmt.Println("Valor de i en defer:", i) // i será 0
i++
fmt.Println("Valor de i después del incremento:", i) // i será 1
}