Maison > développement back-end > Golang > Quelle est la manière la plus idiomatique de créer des itérateurs dans Go ?

Quelle est la manière la plus idiomatique de créer des itérateurs dans Go ?

Mary-Kate Olsen
Libérer: 2024-12-01 17:32:14
original
528 Les gens l'ont consulté

What's the Most Idiomatic Way to Create Iterators in Go?

La manière idiomatique de construire des itérateurs dans Go

Les canaux fournissent un mécanisme d'itération de type canal. Bien qu'ils aient des limites, comme l'impossibilité de sortir d'une itération sans risquer des fuites de goroutines, ils ne constituent pas le moyen idiomatique de créer des modèles d'itérateur dans Go. À cette fin, les fermetures sont plus appropriées.

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
    // closure captures variable n
    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 chaînage des générateurs est simple grâce aux fonctions de première classe de Go. Voici un exemple :

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

En conclusion, bien qu'il existe plusieurs techniques pour créer des itérateurs dans Go, l'approche idiomatique implique des fermetures ou des types nommés avec des méthodes. Le choix entre ceux-ci dépend des besoins spécifiques et des compromis.

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 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