Tillitsdone
down Scroll to discover

Understanding Go's defer Statement Guide

Master Go's defer statement for better code cleanup and resource management.

Learn best practices, common pitfalls, and practical examples to write more maintainable Go programs.
thumbnail

Understanding Go’s defer statement and best practices

Abstract flowing pattern resembling a waterfall cascade with layers of translucent crystal-like structures in warm golden and amber tones viewed from a top-down perspective high-quality ultra-realistic cinematic 8K UHD high resolution sharp and detail

Go’s defer statement is one of those features that, once mastered, becomes an indispensable tool in your programming arsenal. Think of it as your code’s cleanup crew, always ready to tidy up after your function finishes its work. Let’s dive deep into understanding how defer works and how to use it effectively.

What is defer?

The defer statement is like leaving a sticky note for your future self. When you defer a function call, you’re essentially saying, “Hey, make sure to run this before you leave the room.” The deferred function calls are executed in a Last-In-First-Out (LIFO) order, right before the surrounding function returns.

Smooth iridescent stone texture with flowing patterns in ochre and grapeseed colors captured at a 45-degree angle under natural lighting high-quality ultra-realistic cinematic 8K UHD high resolution sharp and detail

Common Use Cases

The most common and practical uses of defer include:

  1. File Operations
func readFile(filename string) error {
file, err := os.Open(filename)
if err != nil {
return err
}
defer file.Close()
// Rest of the file operations
}
  1. Mutex Locks
func updateCache() {
mu.Lock()
defer mu.Unlock()
// Protected code here
}
  1. Database Connections
func queryDB() {
conn := db.Connect()
defer conn.Close()
// Database operations
}

Best Practices and Tips

1. Defer Right After Acquisition

Always place your defer statement right after acquiring a resource. This ensures you don’t forget about cleanup, even if you add more code later.

Crystalline fish scales with a holographic effect showing bright off-white and metallic silver colors photographed from a macro close-up angle high-quality ultra-realistic cinematic 8K UHD high resolution sharp and detail

2. Watch Out for Loop Usage

Be careful when using defer inside loops. Remember that deferred functions won’t execute until the function returns, not when the loop iteration ends.

// Don't do this
func processFiles(filenames []string) error {
for _, filename := range filenames {
file, err := os.Open(filename)
if err != nil {
return err
}
defer file.Close() // This will stack up!
}
return nil
}
// Do this instead
func processFiles(filenames []string) error {
for _, filename := range filenames {
if err := processFile(filename); err != nil {
return err
}
}
return nil
}
func processFile(filename string) error {
file, err := os.Open(filename)
if err != nil {
return err
}
defer file.Close()
return nil
}

3. Mind the Order

Remember that deferred functions are executed in LIFO order. This can be particularly important when dealing with dependent resources:

func process() {
defer fmt.Println("First")
defer fmt.Println("Second")
defer fmt.Println("Third")
// This will print:
// Third
// Second
// First
}

4. Be Careful with Named Return Values

When using named return values, defer can modify them:

func example() (result int) {
defer func() {
result *= 2
}()
return 5
// Will return 10, not 5
}

Conclusion

The defer statement is a powerful feature that helps write cleaner, more maintainable code. By following these best practices, you can avoid common pitfalls and make the most of this elegant Go feature. Remember: defer is not just about cleanup – it’s about writing code that’s both robust and readable.

Geometric abstract pattern with interconnected crystal formations in bright modern greys and metallic tones shot from a bird's eye view perspective high-quality ultra-realistic cinematic 8K UHD high resolution sharp and detail

icons/logo-tid.svg Latest Blogs
Discover our top articles, selected to support the growth of your business.
https://imgproxy-landing-page.tillitsdone.com/sig/rs:fit:1200:630/plain/https%3A%2F%2Fcms-r2.tillitsdone.com%2Fwp-content-prod%2Fuploads%2F2025%2F04%2FTill-its-done_SEO_R06_apr_1440x967_edit.jpg@webp React Native คืออะไร ทำความรู้จัก และเริ่มต้นสร้าง Project React Native คือ Framework ที่ช่วยให้นักพัฒนาสร้างแอปมือถือ โดยมีประสิทธิภาพใกล้เคียงกับ Native App ซึ่งลดเวลาและค่าใช้จ่ายในการพัฒนา แต่ทำได้ยังไงกันนะ image_generation/Debug-TailwindCSS-with-DevTools-1732752708935-cdd0a53458db0224ae03d6d0b9599879.png Debug TailwindCSS Issues with Browser DevTools Learn practical techniques for debugging TailwindCSS using browser DevTools. Master the cascade, understand style overrides, and solve common responsive design issues efficiently. image_generation/Jest-Coverage-Reports-Guide-1732733982763-bc09ffcd377b2159e9e17e9d31cc1515.png Using Jest's Coverage Reports for Better Tests Learn how to leverage Jest's coverage reports to write more effective tests, understand coverage metrics, and set meaningful thresholds to maintain high-quality code in your projects. image_generation/TypeScript-Dynamic-Typing-Guide-1732730343665-165af096cc3ac42cdd09fdc9db8939fd.png Dynamic Typing in TypeScript: Tips and Tricks Dive into advanced TypeScript techniques including type inference, assertions, guards, and generic types. Learn how to write more flexible and maintainable TypeScript code with practical examples. image_generation/Flutter-Firebase-Security-Guide-1732785226182-31fd359bc2d1d780b44cb5bb56f8d5e2.png Securing Flutter Apps with Firebase Security Learn how to implement robust security rules in your Flutter applications using Firebase Firestore. Discover best practices, common patterns, and advanced techniques for data protection. image_generation/AstroJS-WordPress-Contact-Forms-1732707848460-eb31a02c72fe24946242670b10dec77d.png Create AstroJS Contact Forms with WordPress Learn how to build a modern contact form by integrating AstroJS with WordPress API. This guide covers setup, implementation, security, and best practices for seamless form handling.
icons/logo-tid.svg

Talk with CEO

Ready to bring your web/app to life or boost your team with expert Thai developers?
Contact us today to discuss your needs, and let’s create tailored solutions to achieve your goals. We’re here to help at every step!
🖐️ Contact us
Let's keep in Touch
Thank you for your interest in Tillitsdone! Whether you have a question about our services, want to discuss a potential project, or simply want to say hello, we're here and ready to assist you.
We'll be right here with you every step of the way.
Contact Information
rick@tillitsdone.com+66824564755
Find All the Ways to Get in Touch with Tillitsdone - We're Just a Click, Call, or Message Away. We'll Be Right Here, Ready to Respond and Start a Conversation About Your Needs.
Address
9 Phahonyothin Rd, Khlong Nueng, Khlong Luang District, Pathum Thani, Bangkok Thailand
Visit Tillitsdone at Our Physical Location - We'd Love to Welcome You to Our Creative Space. We'll Be Right Here, Ready to Show You Around and Discuss Your Ideas in Person.
Social media
Connect with Tillitsdone on Various Social Platforms - Stay Updated and Engage with Our Latest Projects and Insights. We'll Be Right Here, Sharing Our Journey and Ready to Interact with You.
We anticipate your communication and look forward to discussing how we can contribute to your business's success.
We'll be here, prepared to commence this promising collaboration.
Frequently Asked Questions
Explore frequently asked questions about our products and services.
Whether you're curious about features, warranties, or shopping policies, we provide comprehensive answers to assist you.