Sobes.tech
Junior

Koks koncepcija yra įgyvendinama naudojant defer konstrukciją Go kalboje?

sobes.tech AI

Atsakymas iš AI

defer konstrukcija įgyvendina atidėto funkcijos vykdymo koncepciją. Atidėta funkcija vykdoma tiesiog prieš užbaigiant funkciją, kurioje ji yra.

Pagrindiniai punktai:

  • Vykdymo laikas: Atidėta funkcija vykdoma tėvinės funkcijos pabaigoje, net jei įvyksta panika ar išimtis.
  • Stack: Atidėti iškvietimai sudaro stack'ą. Paskutinis atidėtas iškvietimas bus vykdomas pirmas (LIFO).
  • Kintamųjų fiksavimas: Argumentai atidėtoje funkcijoje įvertinami deklaracijos defer metu, o ne vykdymo metu.

Tipiniai naudojimo pavyzdžiai:

  • Failų, tinklo ryšių, mutex'ų uždarymas.
  • Būsenos atkūrimas (pvz., po globalių kintamųjų ar žymenų pakeitimo).
  • Vykdymo laiko matavimas.
// Pavyzdys, kaip naudoti `defer` failo uždarymui
func readFile(filename string) error {
	f, err := os.Open(filename)
	if err != nil {
		return err
	}
	defer f.Close() // Failas bus uždarytas prieš funkcijos pabaigą

	// Skaitymas iš failo...
	return nil
}
// Atidėto iškvietimo stack'o pavyzdys
func process() {
	defer fmt.Println("Pirmas stack'e")
	defer fmt.Println("Antras stack'e")
	defer fmt.Println("Trečias stack'e") // Bus vykdoma paskutinis

	fmt.Println("Apdorojimas...")
}

Atidėto iškvietimo su argumentais pavyzdys:

// Pavyzdys, kaip fiksuoti kintamojo reikšmę deklaracijos metu
func demonstrateDeferArgEval() {
	i := 0
	defer fmt.Println("i reikšmė defer:", i) // i bus 0

	i++
	fmt.Println("i reikšmė po padidinimo:", i) // i bus 1
}