Chiusure

Chiusure #

// Go supporta le [_funzioni anonime_](https://it.wikipedia.org/wiki/Funzione_anonima),
// che possono formare delle <a href="https://it.wikipedia.org/wiki/Chiusura_(informatica)"><em>chiusure</em></a>.
// 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.