Sobes.tech
Junior

Koji koncept se implementira pomoću konstrukcije defer u jeziku Go?

sobes.tech АИ

Одговор од АИ

Konstrukcija defer implementira koncept odložene izvršavanja funkcije. Odložena funkcija se izvršava neposredno pre završetka funkcije koja je sadrži.

Ključne tačke:

  • Vreme izvršavanja: Odložena funkcija se izvršava na kraju roditeljske funkcije, čak i ako dođe do panike ili izuzetka.
  • Stek: Odloženi pozivi formiraju stek. Poslednji odloženi poziv će biti izvršen prvi (LIFO).
  • Hvatanje promenljivih: Argumenti odložene funkcije se procenjuju u trenutku deklaracije defer, a ne u trenutku izvršenja.

Primeri tipične upotrebe:

  • Zatvaranje fajlova, mrežnih konekcija, mutexa.
  • Obnavljanje stanja (npr. nakon promene globalnih promenljivih ili zastavica).
  • Merenje vremena izvršenja.
// Primer korišćenja defer za zatvaranje fajla
func readFile(filename string) error {
	f, err := os.Open(filename)
	if err != nil {
		return err
	}
	defer f.Close() // Fajl će biti zatvoren pre izlaska iz funkcije

	// Čitanje iz fajla...
	return nil
}
// Primer steka odlaganja poziva
func process() {
	defer fmt.Println("Prvi na steku")
	defer fmt.Println("Drugi na steku")
	defer fmt.Println("Treći na steku") // Biće izvršeno poslednje

	fmt.Println("Obrada...")
}

Odloženi pozivi sa argumentima:

// Primer hvatanja vrednosti promenljive u trenutku deklaracije defer
func demonstrateDeferArgEval() {
	i := 0
	defer fmt.Println("Vrednost i u defer:", i) // i će biti 0

	i++
	fmt.Println("Vrednost i nakon inkrementa:", i) // i će biti 1
}