Sobes.tech
Junior

Kāds koncepts tiek īstenots ar konstrukciju defer Go valodā?

sobes.tech AI

Atbilde no AI

defer konstrukcija īsteno atliktās funkcijas kavēšanas koncepciju. Kavētā funkcija tiek izpildīta tieši pirms funkcijas, kurā tā ir iekļauta, beigām.

Galvenie punkti:

  • Izpildes laiks: Kavētā funkcija tiek izpildīta vecāku funkcijas beigās, pat ja notiek panika vai izņēmums.
  • Steks: Kavētie izsaukumi veido steku. Pēdējais kavētais izsaukums tiks izpildīts pirmais (LIFO).
  • Mainīgo noķeršana: Kavētās funkcijas argumenti tiek novērtēti deklarācijas defer brīdī, nevis izpildes laikā.

Tipiski lietošanas piemēri:

  • Failu, tīkla savienojumu, mutexu aizvēršana.
  • Stāvokļa atjaunošana (piemēram, pēc globālo mainīgo vai karogu maiņas).
  • Laika mērīšana.
// Piemērs, kā izmantot `defer` faila aizvēršanai
func readFile(filename string) error {
	f, err := os.Open(filename)
	if err != nil {
		return err
	}
	defer f.Close() // Fails tiks aizvērts pirms funkcijas beigām

	// Lasīšana no faila...
	return nil
}
// Kavēto izsaukumu steka piemērs
func process() {
	defer fmt.Println("Pirmais stekā")
	defer fmt.Println("Otrais stekā")
	defer fmt.Println("Trešais stekā") // Tiks izpildīts pēdējais

	fmt.Println("Apstrāde...")
}

Kavēti izsaukumi ar argumentiem:

// Piemērs, kā noķert mainīgā vērtību deklarācijas brīdī
func demonstrateDeferArgEval() {
	i := 0
	defer fmt.Println("i vērtība defer:", i) // i būs 0

	i++
	fmt.Println("i vērtība pēc inkrementa:", i) // i būs 1
}