AnyCompiler

Closures

Ek closure ek function value hai jo apne khud ke body ke bahar se variables reference karta hai. makeMultiplier har baar call hone par ek naya function wapas karta hai, aur har wapas kiya gaya function apna khud ka factor yaad rakhta hai, jo usko banaye jaane ke lamhe se capture kiya gaya tha.

package main

import "fmt"

func makeMultiplier(factor int) func(int) int {
	return func(n int) int {
		return n * factor
	}
}

func main() {
	double := makeMultiplier(2)
	triple := makeMultiplier(3)

	fmt.Println(double(5))
	fmt.Println(triple(5))
}
Output
10
15

Closures mutable state hold kar sakte hain

Ek closure sirf captured variables nahi parhta — yeh unhe modify bhi kar sakta hai, aur woh modification calls ke darmiyan persist karti hai. makeCounter ka count variable wapas kiye gaye closure ke andar zinda rehta hai, har baar next() call hone par increment hote hue.

package main

import "fmt"

func makeCounter() func() int {
	count := 0
	return func() int {
		count++
		return count
	}
}

func main() {
	next := makeCounter()
	fmt.Println(next())
	fmt.Println(next())
	fmt.Println(next())
}
Output
1
2
3

Aage: goroutines — Go ka lightweight, built-in concurrency primitive.

Practice exercise

Ek function makeAdder(x int) func(int) int likhein jo ek closure wapas kare jo apne argument mein x add kare. addFive := makeAdder(5) banayein, phir addFive(10) print karein.