Closure ها
توابع بینام و Closure ها در Go — توابعی که محیط اطراف خود را به خاطر میسپارند.
تابع بینام (Anonymous Function)
تابعی بدون نام که در لحظه تعریف میشود:
func(x int) int {
return x * x
}
اختصاص به متغیر
square := func(x int) int {
return x * x
}
fmt.Println(square(5)) ← 25
فراخوانی فوری (IIFE)
result := func(a, b int) int {
return a + b
}(3, 4) ← بلافاصله فراخوانی میشود
fmt.Println(result) ← 7
Closure چیست؟
Closure تابعی است که متغیرهای محیط تعریف خود را به خاطر میسپارد — حتی بعد از پایان آن محیط:
func counter() func() int {
count := 0 ← متغیر محیط بیرونی
return func() int {
count++ ← به count دسترسی دارد!
return count
}
}
next := counter()
fmt.Println(next()) ← 1
fmt.Println(next()) ← 2
fmt.Println(next()) ← 3 ← state حفظ شده!
هر بار فراخوانی
counter() یک Closure جدید با state مستقل میسازد!Closure های مستقل
c1 := counter()
c2 := counter()
c1() ← 1
c1() ← 2
c2() ← 1 ← مستقل از c1
کاربردهای واقعی
۱. شمارنده و state خصوصی
func makeGreeter(name string) func() string {
return func() string {
return "سلام " + name + "!"
}
}
greetAli := makeGreeter("علی")
fmt.Println(greetAli()) ← سلام علی!
۲. توابع بازگشتی (Higher-Order)
func apply(nums []int, f func(int) int) []int {
result := make([]int, len(nums))
for i, n := range nums {
result[i] = f(n)
}
return result
}
doubled := apply([]int{1, 2, 3}, func(n int) int { return n * 2 })
← [2 4 6]
۳. در Goroutine ها
go func() {
fmt.Println("در goroutine اجرا شدم!")
}()
این مبحث بخشی از دوره آموزش کامل گو است.