Go by Example - IT: Chiusure

Go supporta le funzioni anonime, che possono formare delle chiusure. Le funzioni anonime sono utili quando vuoi definire una funzione senza darle un nome.

package main
import "fmt"

Questa funzione intSeq restituisce un’altra funzione, che definiamo anonimamente dentro il corpo della funzione intSeq. La funzione restituita racchiude la variabile i per formare una chiusura.

func intSeq() func() int {
    i := 0
    return func() int {
        i += 1
        return i
    }
}
func main() {

Facciamo una chiamata ad intSeq, assegnando il risultato (una funzione) a nextInt. Il valore di questa funzione racchiude in sé stessa il valore di i, il quale verrà aggiornato la prossima volta che utilizziamo nextInt.

    nextInt := intSeq()

Osserviamo l’effetto della chiusura facendo una chiamata a nextInt un po’ di volte.

    fmt.Println(nextInt())
    fmt.Println(nextInt())
    fmt.Println(nextInt())

Per confermare che lo stato è unico a quella funzione particolare, creiamo e testiamone una nuova.

    newInts := intSeq()
    fmt.Println(newInts())
}
$ go run closures.go
1
2
3
1

L’ultima feature delle funzioni che vedremo per il momento è la ricorsione.

Prossimo esempio: Ricorsione.