Sobes.tech
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ő:

  1. 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.
  2. 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.
  3. 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.