Sobes.tech
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 defer deklaratsiooni 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
}