Maison >développement back-end >Golang >Comment puis-je implémenter idiomatiquement des itérateurs dans Go ?

Comment puis-je implémenter idiomatiquement des itérateurs dans Go ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-02 04:48:13387parcourir

How Can I Idiomatically Implement Iterators in Go?

Existe-t-il une implémentation d'itérateur idiomatique dans Go ?

Les canaux, qui rappellent les itérateurs, proposent une itération via le mot-clé range. Cependant, l’incapacité de sortir de ces boucles sans créer de fuites goroutines limite leur utilité. À la recherche d'un modèle d'itérateur plus idiomatique, les développeurs ont posé des questions sur la façon d'itérer de manière expressive et de combiner des itérateurs à l'aide d'opérateurs tels que mapper, filtrer et réduire.

Approche basée sur la fermeture

Malgré la maniabilité des canaux, les fermetures s'avèrent souvent plus adaptées. Les fermetures permettent la création d'itérateurs qui génèrent des valeurs de manière séquentielle. Voici un exemple de création d'un itérateur pour des nombres pairs à l'aide d'une fermeture :

func newEven() func() int {
    n := 0
    return func() int {
        n += 2
        return n
    }
}

Approche basée sur la méthode

Si les fermetures ne vous conviennent pas, vous pouvez employer un type nommé avec une méthode :

type even int

func (e *even) next() int {
    *e += 2
    return int(*e)
}

Compromis et Chaînage

Le choix entre les fermetures et les méthodes implique des compromis. Les fermetures sont plus flexibles, tandis que les méthodes fournissent une structure plus explicite.

Le chaînage est simple dans Go grâce à la nature de première classe des fonctions. L'exemple suivant montre comment chaîner un générateur de nombres pairs avec une fonction de mise au carré :

func mapInt(g intGen, f func(int) int) intGen {
    return func() int {
        return f(g())
    }
}

func square(i int) int {
    return i * i
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn