Sobes.tech
Middle

Goда жабык (closure) эмне жана анын иштөө принциби кандай?

sobes.tech AI

AIден жооп

Go-догу жабышуу — бул функция, ал өзүнүн лексикалык чөйрөсүндөгү өзгөрмөлөрдүн маанисин "эсте сактайт", анткени бул чөйрө жок болуп калса да.

Иштөө принциби төмөндөгүчө:

  1. Жабышуу (мисалы, башка функциянын ичинде) түзүлгөндө, ал аны жарыялаган чөйрөдөн шилтемелерди кармайт.
  2. Бул кармалган өзгөрмөлөр жабышуу бар болгон убакытка чейин жашайт, анткени аларды жарыялаган функция аяктагандан кийин да.
  3. Ар бир чакырганда, жабышуу ошол кармалган өзгөрмөлөргө кайтып, аларды өзгөртүүгө мүмкүнчүлүк берет.

Мисал:

package main

import "fmt"

func makeCounter() func() int {
	count := 0 // Чөйрөдөгү тышкы өзгөрмө
	return func() int { // Бул жабышуу
		count++ // `count`ка кайрылар жана аны өзгөртөт
		return count
	}
}

func main() {
	counter1 := makeCounter()
	fmt.Println(counter1()) // 1 чыгарат
	fmt.Println(counter1()) // 2 чыгарат

	counter2 := makeCounter() // Өзүнүн `count` менен жаңы жабышуу түзөт
	fmt.Println(counter2()) // 1 чыгарат
}

Бул мисалда, makeCounter функциясы функцияны (жабышуу) кайтарат. Бул жабышуу count өзгөрмөсүн "кармайт". Ар бир чакырганда, кайтарылган функция count маанисин көбөйтөт, ал ушул жабышуунун конкреттүү нускамасына таандык.