Go by Example: Closures

Go anonim funksiyalarni qo’llab-quvvatlaydi, ular closurelarni hosil qilishi mumkin. Anonim funksiyalar funksiyani nomlamasdan, joyida e’lon qilmoqchi bo’lganingizda foydalidir.

package main
import "fmt"

Bu intSeq funksiyasi boshqa funksiyani qaytaradi, biz uni intSeqning tanasida anonim tarzda aniqlaymiz. Qaytarilgan funksiya closure hosil qilish uchun i o’zgaruvchisini qamrab oladi (closes over).

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

Biz intSeqni chaqiramiz va natijani (funksiyani) nextIntga o’zlashtiramiz. Ushbu funksiya qiymati o’z i qiymatini qamrab oladi, u har gal nextIntni chaqirganimizda yangilanadi.

    nextInt := intSeq()

nextIntni bir necha marta chaqirib, closure ta’sirini ko’ring.

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

Holat o’sha aniq funksiyaga xos ekanligini tasdiqlash uchun, yangisini yaratib sinab ko’ring.

    newInts := intSeq()
    fmt.Println(newInts())
}
$ go run closures.go
1
2
3
1

Hozircha ko’rib chiqadigan funksiyalarning oxirgi xususiyati — rekursiya.

Keyingi misol: .