Junior
Welke concept wordt geïmplementeerd met de constructie defer in de Go-taal?
sobes.tech AI
Antwoord van AI
De constructie defer implementeert het concept van uitgestelde functiebesturing. De uitgestelde functie wordt direct vóór het voltooien van de omringende functie uitgevoerd.
Belangrijke punten:
- Uitvoertijd: De uitgestelde functie wordt aan het einde van de ouderfunctie uitgevoerd, zelfs als er een paniek of uitzondering optreedt.
- Stack: Uitgestelde oproepen vormen een stack. De laatste uitgestelde oproep wordt als eerste uitgevoerd (LIFO).
- Vastleggen van variabelen: Argumenten van de uitgestelde functie worden geëvalueerd op het moment van de declaratie van
defer, niet op het moment van uitvoering.
Typische gebruiksvoorbeelden:
- Sluiten van bestanden, netwerkverbindingen, mutexen.
- Herstellen van de toestand (bijvoorbeeld na het wijzigen van globale variabelen of vlaggen).
- Meting van de uitvoeringstijd.
// Voorbeeld van het gebruik van defer om een bestand te sluiten
func readFile(filename string) error {
f, err := os.Open(filename)
if err != nil {
return err
}
defer f.Close() // Het bestand wordt gesloten voordat de functie wordt verlaten
// Lezen uit het bestand...
return nil
}
// Voorbeeld van een stack van defer-aanroepen
func process() {
defer fmt.Println("Eerste in de stack")
defer fmt.Println("Tweede in de stack")
defer fmt.Println("Derde in de stack") // Wordt als laatste uitgevoerd
fmt.Println("Verwerking...")
}
Uitgestelde oproepen met argumenten:
// Voorbeeld van het vastleggen van de waarde van een variabele op het moment van de defer-declaratie
func demonstrateDeferArgEval() {
i := 0
defer fmt.Println("Waarde van i in defer:", i) // i zal 0 zijn
i++
fmt.Println("Waarde van i na incrementeel:", i) // i zal 1 zijn
}