گو از توابع بی نام پشتیبانی میکند، که میتونه به صورت تابع بستار پیاده سازی بشود.توابع بی نام زمانی که بخواهیم یک تابع خطی را به صورت بی نام معرفی کنیم مورد استفاده قرار میگیرند.
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
در مبحث بعدی ما به آخرین ویژگی از توابع یعنی بازگشتی ها میپردازیم.
<<توابع متغییر------------------------------ بازگشتی ها >>