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