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
}