defer schedules function calls at surrounding function return—LIFO order. Use for Close(), mutex unlocks, and tracing spans. panic unwinds the stack; recover catches panics inside deferred functions only.
defer patterns
f, err := os.Open("file")
if err != nil { return err }
defer f.Close()
Deferred calls evaluate arguments immediately but run at return—watch loop defer pitfalls (defer in loops stacks many calls).
panic/recover
Reserve for truly unexpected bugs—not control flow. HTTP servers sometimes recover per-request to return 500 instead of crashing the process.
Important interview questions and answers
- Q: defer order?
A: Last deferred runs first on return. - Q: recover outside defer?
A: Ineffective—recover only works inside deferred functions during panic unwind.
Self-check
- When do deferred functions run?
- Should errors use panic?
Pitfall: defer inside loops stacks N defers—use a function literal or explicit cleanup in loops.
Interview prep
- defer order?
LIFO—last deferred runs first on function return.
- recover scope?
Only effective inside deferred functions during panic unwind.