AnyCompiler

defer, panic, aur recover

defer ek function call ko schedule karta hai jo surrounding function wapas hone se theek pehle chalta hai, chahe woh kaise bhi wapas ho. Isko sab se zyada cleanup ke liye istemal kiya jaata hai — ek file close karna, ek mutex unlock karna — jo use open karne wale code ke bilkul pas 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 foran normal execution rok deta hai aur call stack ko unwind karna shuru kar deta hai — Go ka exception throw karne ke sab se kareeb equivalent, jo waqai 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 ke neeche safeDivide ek runtime panic (zero se divide karna) ko ek ordinary wapas ki gayi 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 istemal karein (defer ki wajah se "goodbye" aakhir mein print hona chahiye, chahe woh code mein pehle aata ho).