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
deferbrī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
}