Junior
Ce concept este implementat cu ajutorul construcției defer în limbajul Go?
sobes.tech AI
Răspuns de la AI
Construcția defer implementează conceptul de execuție întârziată a funcției. Funcția întârziată se execută chiar înainte de finalizarea funcției care o conține.
Puncte cheie:
- Timpul de execuție: Funcția întârziată se execută la sfârșitul funcției părinte, chiar dacă are loc un panic sau o excepție.
- Stivă: Apelurile întârziate formează o stivă. Ultimul apel întârziat va fi executat primul (LIFO).
- Captarea variabilelor: Argumentele funcției întârziate sunt evaluate în momentul declarării
defer, nu în momentul execuției.
Exemple de utilizare tipică:
- Închiderea fișierelor, conexiunilor de rețea, mutexurilor.
- Restaurarea stării (de exemplu, după modificarea variabilelor globale sau a steagurilor).
- Măsurarea timpului de execuție.
// Exemplu de utilizare a defer pentru închiderea unui fișier
func readFile(filename string) error {
f, err := os.Open(filename)
if err != nil {
return err
}
defer f.Close() // Fișierul va fi închis înainte de ieșirea din funcție
// Citirea din fișier...
return nil
}
// Exemplu de stivă de apeluri defer
func process() {
defer fmt.Println("Primul din stivă")
defer fmt.Println("Al doilea din stivă")
defer fmt.Println("Al treilea din stivă") // Se va executa ultimul
fmt.Println("Procesare...")
}
Apeluri întârziate cu argumente:
// Exemplu de captare a valorii unei variabile în momentul declarării defer
func demonstrateDeferArgEval() {
i := 0
defer fmt.Println("Valoarea lui i în defer:", i) // i va fi 0
i++
fmt.Println("Valoarea lui i după increment:", i) // i va fi 1
}