Maison > développement back-end > Golang > Quelle est la meilleure façon de créer des itérateurs dans Go : canaux, fermetures ou types nommés ?

Quelle est la meilleure façon de créer des itérateurs dans Go : canaux, fermetures ou types nommés ?

Patricia Arquette
Libérer: 2024-12-07 10:29:15
original
722 Les gens l'ont consulté

What's the Best Way to Create Iterators in Go: Channels, Closures, or Named Types?

Création d'itérateurs dans Go : canaux, fermetures et types nommés

Dans Go, différentes approches existent pour créer des itérateurs. Une option populaire consiste à utiliser des canaux qui ressemblent à des itérateurs. Cependant, les canaux souffrent de limites, notamment en raison du fait qu'ils sont un modèle push plutôt qu'un modèle pull, ce qui entraîne des fuites potentielles.

Une approche idiomatique consiste à utiliser des fermetures. L'exemple suivant montre comment créer un itérateur pour générer des nombres pairs :

package main

import "fmt"

func main() {
    gen := newEven()
    fmt.Println(gen())
    fmt.Println(gen())
    fmt.Println(gen())
    gen = nil // release for garbage collection
}

func newEven() func() int {
    n := 0
    return func() int {
        n += 2
        return n
    }
}
Copier après la connexion

Une autre option consiste à utiliser des types nommés avec des méthodes :

package main

import "fmt"

func main() {
    gen := even(0)
    fmt.Println(gen.next())
    fmt.Println(gen.next())
    fmt.Println(gen.next())
}

type even int

func (e *even) next() int {
    *e += 2
    return int(*e)
}
Copier après la connexion

Le choix entre les fermetures et les types nommés dépend de besoins spécifiques. Les fermetures offrent de la flexibilité, tandis que les types nommés peuvent offrir une approche plus structurée.

De plus, le chaînage des itérateurs est simple dans Go car les fonctions sont des objets de première classe. L'exemple suivant enchaîne un générateur de nombres pairs avec une fonction carrée :

package main

import "fmt"

func main() {
    gen := mapInt(newEven(), square)
    fmt.Println(gen())
    fmt.Println(gen())
    fmt.Println(gen())
    gen = nil // release for garbage collection
}

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
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal