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:
- Kui kapsel luuakse (näiteks teise funktsiooni sees), haarab see viiteid selle ulatuse muutujatele, kus see deklareeritud oli.
- Need haaratud muutujad jäävad elus kuni kapsel eksisteerib, isegi kui funktsioon, kus need deklareeritud olid, on juba lõppenud.
- 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.