15.آموزش GO با مثال (تابع بستار)

گو از توابع بی نام پشتیبانی میکند، که میتونه به صورت تابع بستار پیاده سازی بشود.توابع بی نام زمانی که بخواهیم یک تابع خطی را به صورت بی نام معرفی کنیم مورد استفاده قرار میگیرند.

package main
import "fmt"

این تابع intSeq یک تابع دیگر را بر میگرداند، که ما اون رو به طور بی نام در بدنه intSeq تعریف میکنیم. تابع بازگشتی متغیر i را به فرم بستار نزدیک میکند.

func intSeq() func() int {
    i := 0
    return func() int {
        i++
        return i
    }
}
func main() {

ما intSeqرا فراخوانی میکنیم،ونتیجه تابع را به nextInt.انتصاب میدهیم.این تابع مقدار خود i را ضبط میکند، که با هر بار به روز رسانی ما nextIntرا فراخوانی میکنیم.

   nextInt := intSeq()

تاثیر بستار رو با فراخوانی چند باره تابع nextInt مشاهده کنید.

   fmt.Println(nextInt())
    fmt.Println(nextInt())
    fmt.Println(nextInt())

برای تایید اینکه ببینیم حالت تابع برای هر تابع خاص یکتاست , یه تابع جدید رو میسازیم و امتحان میکنیم.

   newInts := intSeq()
    fmt.Println(newInts())
}

اجرای این برنامه

$ go run closures.go
1
2
3
1

در مبحث بعدی ما به آخرین ویژگی از توابع یعنی بازگشتی ها میپردازیم.

<<توابع متغییر------------------------------ بازگشتی ها >>