Closures

Closures #

// Go support les [_fonctions anonymes_](https://fr.wikipedia.org/wiki/Fonction_anonyme),
// qui peuvent former une [closure](https://fr.wikipedia.org/wiki/Fermeture_(informatique)) (fermeture ou clotûre en français.)
// Les fonctions anonymes sont utiles lorsque l'on veut
// définir des fonctions à la volée, sans avoir à les
//  nommer.

package main

import "fmt"

// Cette fonction `intSeq` renvoie une autre fonction,
// qui est définie anonymement dans le corps de `intSeq`.
// La fonction retournée _embarque_ la variable `i` pour
// former une closure.
func intSeq() func() int {
    i := 0
    return func() int {
        i += 1
        return i
    }
}

func main() {

    // On appelle `intSeq`, et assigne le résultat (une
    // function) à `nextInt`. Cette fonction capture sa
    // propre valeur de `i`, qui sera mise à jour à
    // chaque fois que l'on appelle `nextInt`.
    nextInt := intSeq()

    // Voyez l'effet de la closure en appellant `nextInt`
    // plusieurs fois.
    fmt.Println(nextInt())
    fmt.Println(nextInt())
    fmt.Println(nextInt())

    // Pour confirmer que l'état est unique à cette
    // fonction particulière, créez et testez en une
    // nouvelle.
    newInts := intSeq()
    fmt.Println(newInts())
}
$ go run closures.go
1
2
3
1

# La dernière fonctionnalité des fonctions que nous 
# allons regarder pour le moment, c'est la récursivité.