Middle
Ինչ է փակագիծը (closure) Go-ում և ինչպես է այն աշխատում?
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-ի արժեքը, որը պատկանում է այս կոնկրետ փակման օրինակին։