Sobes.tech
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
}