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