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 اجرا شدم!")
}()

این مبحث بخشی از دوره آموزش کامل گو است.

ابزارهای مرتبط