Sobes.tech
Junior

Aký koncept sa implementuje pomocou konštrukcie defer v jazyku Go?

sobes.tech AI

Odpoveď od AI

Konstrukcia defer implementuje koncept odloženého volania funkcie. Odložené volanie sa vykoná tesne pred ukončením funkcie, ktorá ho obsahuje.

Kľúčové body:

  • Čas vykonania: Odložené volanie sa vykoná na konci rodičovskej funkcie, aj keď dôjde k panike alebo výnimke.
  • Zásobník: Odložené volania tvoria zásobník. Posledné odložené volanie bude vykonané ako prvé (LIFO).
  • Zachytenie premenných: Argumenty odloženého volania sa vyhodnocujú v momente deklarácie defer, nie v momente vykonania.

Príklady typického použitia:

  • Zatvorenie súborov, sieťových spojení, mutexov.
  • Obnovenie stavu (napríklad po zmene globálnych premenných alebo vlajok).
  • Meranie času vykonania.
// Príklad použitia defer na zatvorenie súboru
func readFile(filename string) error {
	f, err := os.Open(filename)
	if err != nil {
		return err
	}
	defer f.Close() // Súbor bude zatvorený pred ukončením funkcie

	// Čítanie zo súboru...
	return nil
}
// Príklad zásobníka volaní defer
func process() {
	defer fmt.Println("Prvý v zásobníku")
	defer fmt.Println("Druhý v zásobníku")
	defer fmt.Println("Tretí v zásobníku") // Bude vykonané ako posledné

	fmt.Println("Spracovanie...")
}

Odložené volania s argumentmi:

// Príklad zachytenia hodnoty premennej v momente deklarácie defer
func demonstrateDeferArgEval() {
	i := 0
	defer fmt.Println("Hodnota i v defer:", i) // i bude 0

	i++
	fmt.Println("Hodnota i po inkrementácii:", i) // i bude 1
}