Header Ads

Header ADS

Defer , Panic , Recover



🔹 1. defer কী? (সহজ ভাষায়)

defer মানে হলো —
👉 এই কাজটা ফাংশন শেষ হওয়ার ঠিক আগে করো

যখনই defer লেখা হয়, Go সেটা মনে রাখে
আর ফাংশন return করার আগে সেটা execute করে।

🔁 মনে রাখার ট্রিক

defer = “শেষে করবো”


🔹 2. defer এর সবচেয়ে সহজ উদাহরণ

package main

import "fmt"

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

🧠 Output হবে:

Hello
World

কেন?

  • fmt.Println("World") defer করা হয়েছে

  • তাই main() শেষ হওয়ার সময় এটা চালানো হয়েছে


🔹 3. একাধিক defer হলে কী হয়? (LIFO)

Go তে defer কাজ করে Stack এর মতো
👉 Last In, First Out (LIFO)

উদাহরণ:

package main

import "fmt"

func main() {
    defer fmt.Println("1")
    defer fmt.Println("2")
    defer fmt.Println("3")
}

🧠 Output:

3
2
1

👉 কারণ: শেষ defer আগে execute হয়


🔹 4. defer কেন দরকার?

বাস্তবে defer ব্যবহার হয়:

  • file বন্ধ করার জন্য

  • database connection close করতে

  • mutex unlock করতে

  • panic হলেও clean-up নিশ্চিত করতে

বাস্তব উদাহরণ (File close):

file, err := os.Open("test.txt")
if err != nil {
    return
}
defer file.Close()

👉 যেখানেই function শেষ হোক না কেন,
file অবশ্যই close হবে


🔥 এখন আসি panic আর recover


🔹 5. panic কী?

panic মানে —
👉 প্রোগ্রাম ভেঙে পড়ছে!

যখন panic হয়:

  • normal execution বন্ধ হয়ে যায়

  • program crash করে

  • তবে তার আগে defer গুলো execute হয়

উদাহরণ:

package main

func main() {
    panic("Something went wrong!")
}

🔹 6. recover কী?

recover দিয়ে আমরা panic থেকে program কে বাঁচাতে পারি

⚠️ কিন্তু:

recover শুধু defer এর ভিতরে কাজ করে


🔹 7. panic + defer + recover একসাথে

সম্পূর্ণ example:

package main

import "fmt"

func main() {

    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered from panic:", r)
        }
    }()

    fmt.Println("Start")
    panic("Something bad happened")
    fmt.Println("End") // এই লাইন execute হবে না
}

🧠 Output:

Start
Recovered from panic: Something bad happened

ব্যাখ্যা:

  1. panic হলে program ভাঙার পথে যায়

  2. কিন্তু তার আগে defer execute হয়

  3. recover() panic ধরে ফেলে

  4. program crash না করে gracefully শেষ হয়


🔹 8. বাস্তবে recover কোথায় ব্যবহার হয়?

  • Web server (Express / Gin / Fiber)

  • Middleware level error handling

  • Critical system crash আটকাতে

উদাহরণ (Backend চিন্তা করে):

func safeFunction() {
    defer func() {
        if err := recover(); err != nil {
            fmt.Println("Error handled:", err)
        }
    }()

    // risky code
}

🔹 9. মনে রাখার শর্ট নোট 🧠

Keywordকাজ
deferfunction শেষ হওয়ার আগে execute
panicprogram crash
recoverpanic থেকে বাঁচায়
recover কাজ করেশুধু defer এর ভিতরে

🔥 Beginner Tip (খুব গুরুত্বপূর্ণ)

❌ সব জায়গায় panic/recover ব্যবহার কোরো না
✅ Normal error এর জন্য error return করো
panic/recover শুধু unexpected critical error এর জন্য



Powered by Blogger.