Middle
Goда жабык (closure) эмне жана анын иштөө принциби кандай?
sobes.tech AI
AIден жооп
Go-догу жабышуу — бул функция, ал өзүнүн лексикалык чөйрөсүндөгү өзгөрмөлөрдүн маанисин "эсте сактайт", анткени бул чөйрө жок болуп калса да.
Иштөө принциби төмөндөгүчө:
- Жабышуу (мисалы, башка функциянын ичинде) түзүлгөндө, ал аны жарыялаган чөйрөдөн шилтемелерди кармайт.
- Бул кармалган өзгөрмөлөр жабышуу бар болгон убакытка чейин жашайт, анткени аларды жарыялаган функция аяктагандан кийин да.
- Ар бир чакырганда, жабышуу ошол кармалган өзгөрмөлөргө кайтып, аларды өзгөртүүгө мүмкүнчүлүк берет.
Мисал:
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 маанисин көбөйтөт, ал ушул жабышуунун конкреттүү нускамасына таандык.