Maison >développement back-end >Golang >Comment créer des itérateurs idiomatiques dans Go ?

Comment créer des itérateurs idiomatiques dans Go ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-06 16:13:15565parcourir

How to Create Idiomatic Iterators in Go?

Création d'itérateurs idiomatiques dans Go

Les itérateurs sont essentiels pour parcourir les collections de manière pratique et expressive. Bien que les chaînes puissent initialement sembler être une option viable, leur modèle push et leurs problèmes de fuite de mémoire limitent leur utilité.

Approches idiomatiques

Fermetures :

Fermetures offrent une méthode simple pour implémenter des itérateurs. En capturant une variable dans une fonction, la fonction peut être utilisée comme itérateur, chaque appel incrémentant la variable et renvoyant sa valeur. Par exemple :

import "fmt"

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

Types nommés avec méthodes :

Une autre approche consiste à définir un type nommé avec une méthode qui itère sur la collection. Cette méthode peut mettre à jour son état interne et renvoyer l'élément suivant de la séquence. Par exemple :

type even int

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

Compromis et sélection :

Le choix de l'approche dépend d'exigences spécifiques. Les canaux excellent dans les scénarios simultanés, les fermetures offrent flexibilité et facilité d'utilisation, tandis que les types nommés offrent clarté et encapsulation.

Chaînage d'itérateurs

Les concepts de programmation fonctionnelle peuvent être exploités pour chaîner plusieurs itérateurs pour des transformations complexes. Les fonctions peuvent être composées en itérateurs, permettant des opérations telles que le mappage, le filtrage et le pliage.

Voici un exemple d'enchaînement d'itérateurs à l'aide de fermetures :

import "fmt"

type intGen func() int

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

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

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

func main() {
    gen := mapInt(newEven(), square)
    fmt.Println(gen())
    fmt.Println(gen())
    fmt.Println(gen())
}

En utilisant la flexibilité et l'extensibilité de Go types de fonctions, les itérateurs peuvent être combinés sans effort pour transformer et traiter efficacement les collections.

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