AnyCompiler

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")
}
Output
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))
}
Output
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).