Go – Function Basics
Estimated reading: 3 minutes 115 views

⏳ Go defer Keyword – Delay Function Execution Until Surrounding Function Returns (2025 Guide)

🧲 Introduction – What Is defer in Go?

In Go, the defer keyword is used to postpone the execution of a function until the enclosing function completes. It’s commonly used for cleanup operations, like closing files, unlocking mutexes, or logging the end of a function—ensuring actions occur even in case of early returns or panics.

🎯 In this section, you’ll learn:

  • How defer works and when it’s executed
  • Use cases like file closing, logging, and error handling
  • Order of execution for multiple defer statements
  • Common pitfalls and best practices

✅ Basic Syntax – Using defer

func main() {
    defer fmt.Println("World")
    fmt.Println("Hello")
}

📤 Output:

Hello  
World

fmt.Println("World") is deferred and runs after main() completes.


📦 Real-World Use Case – File Closing

file, err := os.Open("data.txt")
if err != nil {
    log.Fatal(err)
}
defer file.Close()
// process file here

✅ Ensures file.Close() is called no matter what—even if errors or return statements occur before the end.


🔁 Multiple defer Calls – LIFO Order

Multiple defer statements are executed in Last-In, First-Out (LIFO) order:

func main() {
    defer fmt.Println("First")
    defer fmt.Println("Second")
    defer fmt.Println("Third")
}

📤 Output:

Third  
Second  
First

✅ The most recent defer is executed first—like a stack.


🧠 Defer Captures Immediate Values

Function arguments in defer statements are evaluated when the defer is declared, not when it executes:

func main() {
    x := 5
    defer fmt.Println("Deferred:", x)
    x = 10
    fmt.Println("Now:", x)
}

📤 Output:

Now: 10  
Deferred: 5

✅ Even though x was later changed, defer captures x = 5.


🔐 Example – Defer with Named Return

func example() (result int) {
    defer func() {
        result += 1
    }()
    return 5
}

func main() {
    fmt.Println(example()) // Output: 6
}

✅ Named return variables can be modified by deferred functions.


⚠️ Common Pitfalls

MistakeFix / Explanation
Thinking defer runs immediatelyDefer schedules the call, doesn’t execute it
Expecting updated argument valuesArguments are evaluated at the time of deferral
Using defer in large loopsMay cause performance issues due to stacking

🧠 Best Practices

  • ✅ Use defer for resource cleanup (files, connections, locks)
  • ✅ Place defer right after acquiring resources
  • ❌ Avoid deferring in tight loops unless needed
  • ✅ Use closures with defer for advanced control

📌 Summary – Recap & Next Steps

The defer keyword in Go provides a reliable way to schedule cleanup operations that are guaranteed to execute at the end of a function. It helps simplify code and ensures robust behavior in the face of errors or early returns.

🔍 Key Takeaways:

  • defer delays execution until the function returns
  • Deferred calls are executed in LIFO order
  • Argument values are evaluated at defer time, not execution time
  • Ideal for resource management and error-safe cleanups

⚙️ Next: Explore Go Panic and Recover to gracefully handle unexpected runtime errors.


❓ FAQs – Go defer Keyword

❓ When is a defer statement executed?
✅ After the surrounding function returns, in LIFO order.

❓ Can I defer a function with arguments?
✅ Yes, but remember: arguments are evaluated immediately, not at execution time.

❓ Does defer work with panic?
✅ Yes. Deferred calls are executed even during a panic, making them essential for cleanup.

❓ Can I use multiple defer statements?
✅ Absolutely. They’ll execute in reverse order of declaration.

❓ Should I use defer inside a loop?
✅ Use with caution—deferred calls stack up and may consume memory in long loops.


Share Now :
Share

Go defer Keyword

Or Copy Link

CONTENTS
Scroll to Top