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, που ανήκει σε αυτό το συγκεκριμένο αντίγραφο του κλεισίματος.