Middle
Mi az a zárójel (closure) a Go-ban, és hogyan működik?
sobes.tech MI
Válasz az MI-től
A Go-ban a lezárás egy olyan függvény, amely "emlékszik" a környezetében lévő változók értékére, még akkor is, ha ez a környezet már nem létezik.
A működési elv a következő:
- Amikor egy lezárást (például egy másik függvényen belül) hozunk létre, az referenciákat fog meg a deklarált környezet változóira.
- Ezek a fogott változók addig élnek, amíg a lezárás létezik, még akkor is, ha a változókat tartalmazó függvény már befejeződött.
- Minden híváskor a lezárás hozzáférhet és módosíthatja ezeket a fogott változókat.
Példa:
package main
import "fmt"
func makeCounter() func() int {
count := 0 // Külső környezet változója
return func() int { // Ez egy lezárás
count++ // Hozzáfér és módosít `count`
return count
}
}
func main() {
counter1 := makeCounter()
fmt.Println(counter1()) // 1-et ír ki
fmt.Println(counter1()) // 2-t ír ki
counter2 := makeCounter() // Új lezárás, saját `count`-tal
fmt.Println(counter2()) // 1-et ír ki
}
Ebben a példában a makeCounter függvény egy függvényt (lezárást) ad vissza. Ez a lezárás "elfogja" a count változót. Minden hívás növeli a count értékét, amely ennek a konkrét lezárásnak az egyik példánya.