Junior
Millist kontseptsiooni rakendatakse Go keeles defer-i konstruktsiooniga?
sobes.tech AI
Vastus AI-lt
defer konstruktsioon realiseerib hilinenud funktsiooni täitmise kontseptsiooni. Hilinenud funktsioon täidetakse otse enne funktsiooni lõpetamist, mis see sisaldab.
Peamised punktid:
- Täitmisaeg: Hilinenud funktsioon täidetakse vanemfunktsiooni lõpus, isegi kui toimub paan või erind.
- Köide: Hilinenud kutsed moodustavad keti. Viimane hilinenud kutsung täidetakse esimese (LIFO).
- Muuttujate haaramine: Argumente hilinenud funktsioonis hinnatakse
deferdeklaratsiooni ajal, mitte täitmise ajal.
Tüüpilised kasutusnäited:
- Failide, võrguliiklus- ja mutex-ühenduste sulgemine.
- Seisundi taastamine (näiteks pärast globaalsete muutujate või lippude muutmist).
- Täitmise aja mõõtmine.
// Näide `defer` kasutamisest faili sulgemiseks
func readFile(filename string) error {
f, err := os.Open(filename)
if err != nil {
return err
}
defer f.Close() // Fail suletakse enne funktsiooni väljumist
// Failist lugemine...
return nil
}
// Hilinenud funktsioonikutsumiste keti näide
func process() {
defer fmt.Println("Esimene kettis")
defer fmt.Println("Teine kettis")
defer fmt.Println("Kolmas kettis") // Täidetakse viimati
fmt.Println("Töötlus...")
}
Argumentidega hilinenud funktsioonikutsed:
// Näide, kuidas haarata muutujat väärtus deklaratsiooni ajal
func demonstrateDeferArgEval() {
i := 0
defer fmt.Println("i väärtus defer:", i) // i on 0
i++
fmt.Println("i väärtus pärast inkrementi:", i) // i on 1
}