এই তিনটি keyword deferred execution এবং exceptional situations পরিচালনা করে। defer cleanup schedule করে, panic একটি runtime crash ট্রিগার করে (সত্যিকারের exceptional cases এর জন্য), এবং recover একটি panic ধরতে পারে যাতে প্রোগ্রাম crash না হয়।
এই তিনটি keyword deferred execution এবং exceptional situations পরিচালনা করে। defer cleanup schedule করে, panic একটি runtime crash ট্রিগার করে (সত্যিকারের exceptional cases এর জন্য), এবং recover একটি panic ধরতে পারে যাতে প্রোগ্রাম crash না হয়।
func readFile() error {
f, err := os.Open("file.txt")
if err != nil { return err }
defer f.Close() // GUARANTEED to run when readFile returns (any path)
// ... use f, with multiple return points ...
return nil // f.Close() runs here automatically
}
defer একটি ফাংশন কল schedule করে যা surrounding function রিটার্ন করার সময় execute হয় — এটি যেভাবেই রিটার্ন হোক না কেন (normal return, error, বা panic)। এটি cleanup নিশ্চিত করার idiomatic উপায়: ফাইল বন্ধ করা, mutex আনলক করা, connections বন্ধ করা — acquisition এর পাশে রাখা হয় যাতে আপনি এটি ভুলতে না পারেন।
defer fmt.Println("1")
defer fmt.Println("2")
defer fmt.Println("3")
// prints: 3, 2, 1 — last deferred, first executed (stack order)
func mustPositive(n int) {
if n < 0 {
panic("negative not allowed") // stops normal execution, unwinds the stack
}
}
// panic runs deferred functions as it unwinds, then crashes the program (with a stack trace)
panic normal flow থেমে দেয় এবং call stack কে unwind করে (পথে deferred functions চালায়), শেষ পর্যন্ত প্রোগ্রাম crash করে। এটি programmer errors / unrecoverable conditions এর জন্য (out-of-bounds, nil dereference, impossible states) — ordinary errors এর জন্য নয় (সেগুলি returned error values ব্যবহার করে)।
func safeProcess() {
defer func() {
if r := recover(); r != nil { // recover() returns the panic value
fmt.Println("recovered from:", r) // handle it; program continues
}
}()
panic("something broke") // this panic is caught by the recover above
}
// safeProcess returns normally instead of crashing
recover একটি panicking goroutine এর নিয়ন্ত্রণ পুনরুদ্ধার করে — কিন্তু শুধুমাত্র একটি deferred function এর ভিতরে কাজ করে। এটি খুব কম ব্যবহৃত হয়, উদাহরণ স্বরূপ একটি একক request handler কে একটি সম্পূর্ণ server crash হতে বাধা দিতে।
Normal/expected failures (file missing, bad input, validation) → return an error value
panic/recover → reserve for TRULY exceptional cases (bugs, unrecoverable states)
and boundaries (e.g. a server recovering so one bad request doesn't kill the process)
defer একটি অপরিহার্য, idiomatic Go feature যা guaranteed cleanup এর জন্য — resource release কে acquisition এর পাশে রাখা এবং নিশ্চিত করা যে এটি প্রতিটি return path তে চলে (panics সহ), যা leaked files, locks, এবং connections প্রতিরোধ করে manual cleanup এর চেয়ে অনেক বেশি নির্ভরযোগ্যভাবে।
এর LIFO ordering বোঝা ও গুরুত্বপূর্ণ। panic/recover একটি exception-এর মতো mechanism প্রদান করে, কিন্তু critical principle হল যে Go সেগুলি genuinely exceptional, unrecoverable situations এর জন্য সংরক্ষিত রাখে — normal errors সর্বদা values হিসাবে return করা উচিত এবং checked করা উচিত।
General exception handling হিসাবে panic/recover misusing করা un-idiomatic এবং exception-based languages থেকে আসা developers এর জন্য একটি সাধারণ ভুল।
Knowing when to use defer (সর্বদা, cleanup এর জন্য), error returns (normal failures), এবং panic/recover (rare, exceptional, বা boundaries এ) হল সঠিক, idiomatic Go লেখার ভিত্তি এবং একটি frequent interview topic।