Sobes.tech
Middle

Ինչ է փակագիծը (closure) Go-ում և ինչպես է այն աշխատում?

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-ի արժեքը, որը պատկանում է այս կոնկրետ փակման օրինակին։