Go by Example: Closures

Go supporta le funzioni anonime, che possono formare closure. Le funzioni anonime sono utili quando vuoi definire una funzione inline senza doverla nominare.

package main
import "fmt"

Questa funzione intSeq restituisce un’altra funzione, che definiamo anonimamente nel corpo di intSeq. La funzione restituita cattura la variabile i per formare una closure.

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

Chiamiamo intSeq, assegnando il risultato (una funzione) a nextInt. Questo valore di funzione cattura il suo proprio valore i, che sarà aggiornato ogni volta che chiamiamo nextInt.

    nextInt := intSeq()

Vedi l’effetto della closure chiamando nextInt alcune volte.

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

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

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

L’ultima caratteristica delle funzioni che vedremo per ora è la ricorsione.

Prossimo esempio: .