Aller au contenu

Les Itérateurs en Go

Les itérateurs sont apparus tout récemment dans la version 1.23 de Go. Ils font suite à la généricité introduite en Go 1.18.

Nous pouvons illustrer les itérateurs avec un exemple simple qui génère les n premiers éléments de la fameuse suite de Fibonacci :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package main

import (
    "fmt"
)

func Fibonacci(n int) func(func(int) bool) {
    f0, f1 := 0, 1
    return func(yield func(int) bool) {
        for range n {
            if !yield(f0) {
                return
            }
            f0, f1 = f1, f0+f1
        }
    }
}

func main() {
    for i := range Fibonacci(20) {
        fmt.Println(i)
    }
}

La fonction Fibonacci retourne une fonction (l’itérateur) qui prend en argument une fonction (communément appelé yield) qui retourne un booléen.

Au passage, notez l’utilisation de l’instruction for range n de la ligne 10. Cette construction, introduite avec Go 1.22, remplace avantageusement une boucle for i := 0; i < n; i++ classique.

Lorsque l’itérateur est utilisé dans une boucle for range (ligne 20), Go crée automatiquement la fonction yield avec le corps de la boucle (ligne 21). À chaque itération, la fonction yield est appelée avec la valeur courante de la suite de Fibonacci. Si yield retourne false, l’itérateur s’arrête.

On obtient le même résultat en appelant explicitement l’itérateur avec une fonction anonyme :

Fibonacci(10)(func(i int) bool {
    fmt.Println(i)
    return true
})

mais l’utilisation dans une boucle for range est plus élégante.

Pour plus d’informations, vous pouvez consulter les articles suivants :

Etudiez aussi le paquetage iter qui fournit des itérateurs pour les types de données courants.

À partir de Go 1.23, le paquetage slices de la bibliothèque standard a été enrichi avec des fonctions utilisant des itérateurs.