Sobes.tech
Middle

Mis on sulg (closure) Go keeles ja kuidas see töötab?

sobes.tech AI

Vastus AI-lt

Kapsel Go-s on funktsioon, mis "mäletab" selle leksikaalse keskkonna muutujate väärtusi, isegi pärast seda, kui see keskkond on lõppenud.

Tööpõhimõte on järgmine:

  1. Kui kapsel luuakse (näiteks teise funktsiooni sees), haarab see viiteid selle ulatuse muutujatele, kus see deklareeritud oli.
  2. Need haaratud muutujad jäävad elus kuni kapsel eksisteerib, isegi kui funktsioon, kus need deklareeritud olid, on juba lõppenud.
  3. Igal kapsli kutsumisel saab see ligi nende haaratud muutujate ja neid muuta.

Näide:

package main

import "fmt"

func makeCounter() func() int {
	count := 0 // Väline muutuja
	return func() int { // See on kapsel
		count++ // See pääseb `count`-le ligi ja muudab seda
		return count
	}
}

func main() {
	counter1 := makeCounter()
	fmt.Println(counter1()) // Kuvab 1
	fmt.Println(counter1()) // Kuvab 2

	counter2 := makeCounter() // Loob uue kapsli oma `count`-ga
	fmt.Println(counter2()) // Kuvab 1
}

Selles näites tagastab funktsioon makeCounter funktsiooni (kapsli). See kapsel "haarab" muutuja count. Igal kutsumisel suurendab see count väärtust, mis kuulub sellele konkreetsele kapsli eksemplarile.