defer, panic, aur recover
defer ek function call ko schedule karta hai jo surrounding function return hone se theek pehle run hota hai, chahe woh kaise bhi return ho. Isko sabse zyada cleanup ke liye use kiya jaata hai — ek file close karna, ek mutex unlock karna — jo use open karne wale code ke bilkul paas likha jaata hai.
package main
import "fmt"
func main() {
fmt.Println("start")
defer fmt.Println("cleanup")
fmt.Println("end")
}start end cleanup
panic aur recover
panic turant normal execution rok deta hai aur call stack ko unwind karna shuru kar deta hai — Go ka exception throw karne ke sabse kareeb equivalent, jo genuinely exceptional situations ke liye reserve hai, everyday error handling ke liye nahi. recover, ek deferred function ke andar call kiya gaya, us unwinding ko rok deta hai aur program ko continue karne deta hai, jo isi wajah se hai ki neeche safeDivide ek runtime panic (zero se divide karna) ko ek ordinary returned value mein badal deta hai.
package main
import "fmt"
func safeDivide(a, b int) (result int) {
defer func() {
if r := recover(); r != nil {
fmt.Println("recovered from:", r)
result = 0
}
}()
return a / b
}
func main() {
fmt.Println(safeDivide(10, 2))
fmt.Println(safeDivide(10, 0))
}5 recovered from: runtime error: integer divide by zero 0
Aage: closures — functions jo apne surrounding scope se variables capture karte hain.
Practice exercise
Apne "hello" print karne ke baad "goodbye" print karne ke liye defer use karo (defer ki wajah se "goodbye" aakhir mein print hona chahiye, chahe woh code mein pehle aata ho).