Sobes.tech
Junior

Quale concetto viene implementato con la costruzione defer nel linguaggio Go?

sobes.tech AI

Risposta dell'AI

La costruzione defer implementa il concetto di esecuzione differita di una funzione. La funzione differita viene eseguita immediatamente prima della conclusione della funzione che la contiene.

Punti chiave:

  • Momento di esecuzione: La funzione differita viene eseguita alla fine della funzione genitore, anche se si verifica un panico o un'eccezione.
  • Stack: Le chiamate differite formano uno stack. L'ultima chiamata differita verrà eseguita per prima (LIFO).
  • Cattura delle variabili: Gli argomenti della funzione differita vengono valutati al momento della dichiarazione di defer, non al momento dell'esecuzione.

Esempi di uso tipico:

  • Chiusura di file, connessioni di rete, mutex.
  • Ripristino dello stato (ad esempio, dopo aver modificato variabili globali o flag).
  • Misurazione del tempo di esecuzione.
// Esempio di utilizzo di defer per chiudere un file
func readFile(filename string) error {
	f, err := os.Open(filename)
	if err != nil {
		return err
	}
	defer f.Close() // Il file verrà chiuso prima di uscire dalla funzione

	// Lettura dal file...
	return nil
}
// Esempio di stack di chiamate defer
func process() {
	defer fmt.Println("Primo nello stack")
	defer fmt.Println("Secondo nello stack")
	defer fmt.Println("Terzo nello stack") // Verrà eseguito per ultimo

	fmt.Println("Elaborazione...")
}

Chiamate differite con argomenti:

// Esempio di cattura del valore di una variabile al momento della dichiarazione di defer
func demonstrateDeferArgEval() {
	i := 0
	defer fmt.Println("Valore di i in defer:", i) // i sarà 0

	i++
	fmt.Println("Valore di i dopo incremento:", i) // i sarà 1
}