Junior
Ποια έννοια υλοποιείται με τη χρήση της κατασκευής defer στη γλώσσα Go;
sobes.tech AI
Απάντηση από AI
Η κατασκευή defer υλοποιεί την έννοια της καθυστερημένης εκτέλεσης της λειτουργίας. Η καθυστερημένη λειτουργία εκτελείται ακριβώς πριν από το κλείσιμο της λειτουργίας που την περιέχει.
Βασικά σημεία:
- Χρόνος εκτέλεσης: Η καθυστερημένη λειτουργία εκτελείται στο τέλος της γονικής λειτουργίας, ακόμη και αν προκληθεί πανικός ή εξαίρεση.
- Στοίβα: Οι καθυστερημένες κλήσεις σχηματίζουν στοίβα. Η τελευταία καθυστερημένη κλήση θα εκτελεστεί πρώτη (LIFO).
- Λήψη μεταβλητών: Τα επιχειρήματα της καθυστερημένης λειτουργίας αξιολογούνται κατά τη στιγμή της δήλωσης
defer, όχι κατά τη στιγμή της εκτέλεσης.
Παραδείγματα τυπικής χρήσης:
- Κλείσιμο αρχείων, δικτυακών συνδέσεων, mutex.
- Αποκατάσταση κατάστασης (π.χ., μετά την αλλαγή παγκόσμιων μεταβλητών ή σημαίων).
- Μέτρηση χρόνου εκτέλεσης.
// Παράδειγμα χρήσης defer για κλείσιμο αρχείου
func readFile(filename string) error {
f, err := os.Open(filename)
if err != nil {
return err
}
defer f.Close() // Το αρχείο θα κλείσει πριν από την έξοδο από τη λειτουργία
// Ανάγνωση από το αρχείο...
return nil
}
// Παράδειγμα στοίβας κλήσεων defer
func process() {
defer fmt.Println("Πρώτο στη στοίβα")
defer fmt.Println("Δεύτερο στη στοίβα")
defer fmt.Println("Τρίτο στη στοίβα") // Θα εκτελεστεί τελευταίο
fmt.Println("Επεξεργασία...")
}
Καθυστερημένες κλήσεις με επιχειρήματα:
// Παράδειγμα λήψης της τιμής μιας μεταβλητής κατά τη δήλωση defer
func demonstrateDeferArgEval() {
i := 0
defer fmt.Println("Τιμή του i στο defer:", i) // i θα είναι 0
i++
fmt.Println("Τιμή του i μετά την αύξηση:", i) // i θα είναι 1
}