🔒 1. Verzögerte Ausführung mit defer
Eine mit defer versehene Anweisung wird garantiert ausgeführt, sobald die umgebende Funktion zurückkehrt (egal ob durch return oder panic):
file, err := os.Open("logfile.txt")
if err != nil {
return err
}
defer file.Close() // Wird IMMER beim Verlassen der Funktion ausgeführt!
// Mehrere defers werden nach dem LIFO-Prinzip (Stack) ausgeführt:
defer fmt.Println("1. Erster Defer")
defer fmt.Println("2. Zweiter Defer")
defer fmt.Println("3. Dritter Defer")
// Ausgabe beim Return: 3 -> 2 -> 1 (Last-In, First-Out)
Wenn du einen Reinraum betrittst, ziehst du Überschuhe an, dann einen Kittel, dann Handschuhe. Mit defer klebst du an jede Handlung sofort einen Erinnerungszettel: "Beim Rausgehen ablegen". Beim Verlassen ziehst du in exakt umgekehrter Reihenfolge (LIFO) zuerst die Handschuhe, dann den Kittel und zuletzt die Überschuhe aus – garantiert rückstandsfrei!
💥 2. panic vs. recover()
panic signalisiert einen unrettbaren, fatalen Fehler (z.B. Nil-Pointer Dereference oder Out-of-Bounds). Mit recover() innerhalb einer defer-Funktion kann ein solcher Panic abgefangen werden:
func SafeWorker() {
defer func() {
if r := recover(); r != nil {
fmt.Println("CRASH VERHINDERT! Panic-Grund:", r)
}
}()
// Kritischer Code, der einen Panic auslösen könnte:
var ptr *int
*ptr = 42 // Würde normalerweise den Server crashen
}
🎯 Aufgaben & Checkliste in aufgabe.go
Verwende panic niemals als Ersatz für reguläre Fehler. Nutze immer error für erwartbare Probleme und reserviere panic für echte Programmierfehler oder unrettbare Systeminkonsistenzen!