Junior
Milyen fogalom valósul meg a defer szerkezet segítségével a Go nyelvben?
sobes.tech MI
Válasz az MI-től
A defer szerkezet a késleltetett függvényhívás koncepcióját valósítja meg. A késleltetett függvény közvetlenül a defer-rel jelölt függvény végrehajtása előtt fut le.
Főbb pontok:
- Végrehajtási idő: A késleltetett függvény a szülőfüggvény végén fut le, még akkor is, ha pánik vagy kivétel történik.
- Verem: A késleltetett hívások veremként működnek. Az utolsó késleltetett hívás lesz az első, aki végrehajtódik (LIFO).
- Változók elfogása: A késleltetett függvény argumentumai a
deferdeklarálásakor értékelődnek ki, nem a végrehajtáskor.
Tipikus példák:
- Fájlok, hálózati kapcsolatok, mutexek lezárása.
- Állapot helyreállítása (pl. globális változók vagy zászlók módosítása után).
- Végrehajtási idő mérése.
// Példa a defer használatára fájl bezárásához
func readFile(filename string) error {
f, err := os.Open(filename)
if err != nil {
return err
}
defer f.Close() // A fájl a függvény végén bezáródik
// Fájl olvasása...
return nil
}
// Példa a defer hívások veremére
func process() {
defer fmt.Println("Első a veremben")
defer fmt.Println("Második a veremben")
defer fmt.Println("Harmadik a veremben") // Utoljára fog végrehajtódni
fmt.Println("Feldolgozás...")
}
Argumentumokkal késleltetett hívások:
// Példa a változó értékének elfogására a defer deklarálásakor
func demonstrateDeferArgEval() {
i := 0
defer fmt.Println("i értéke defer-ben:", i) // i 0 lesz
i++
fmt.Println("i értéke növelés után:", i) // i 1 lesz
}