Maison  >  Article  >  développement back-end  >  Comment puis-je implémenter des générateurs de style Python dans Go ?

Comment puis-je implémenter des générateurs de style Python dans Go ?

DDD
DDDoriginal
2024-11-19 11:25:03835parcourir

How Can I Implement Python-Style Generators in Go?

Générateurs de style Python dans Go

Implémentation

En Python, les générateurs sont des constructions pratiques pour créer des itérateurs. Les Goroutines dans Go offrent des fonctionnalités similaires. Voici une implémentation Go d'un générateur de style Python pour la séquence de Fibonacci :

package main

import "fmt"

// Fibonacci generates the Fibonacci sequence into a channel.
func fibonacci(c chan int) {
    x, y := 1, 1

    for {
        c <- x
        x, y = y, x+y
    }
}

func main() {
    c := make(chan int)
    go fibonacci(c)

    for i := 0; i < 10; i++ {
        fmt.Println(<-c)
    }
}

Performances et gestion de la mémoire

Taille du tampon :

Augmentation la taille du tampon du canal (par exemple, jusqu'à 10) améliorera probablement les performances en réduisant les changements de contexte. Cependant, cela se fait au détriment de la consommation de mémoire.

Gestion de la mémoire :

Dans le code ci-dessus, la goroutine de Fibonacci s'exécute indéfiniment, en attendant les lectures du canal c . Le canal c n'est pas fermé, ce qui entraîne des fuites de mémoire. Voici une implémentation alternative qui résout ce problème :

func fib(n int) chan int {
    c := make(chan int)
    go func() {
        x, y := 0, 1
        for i := 0; i <= n; i++ {
            c <- x
            x, y = y, x+y
        }
        close(c)
    }()
    return c
}

Dans ce cas, la goroutine se termine lorsque n nombres de Fibonacci ont été générés. Le canal est fermé, ce qui entraîne son nettoyage par le ramasse-miettes.

Autres considérations

Pour les scénarios où le nombre de valeurs générées est inconnu, envisagez d'utiliser un canal de sortie distinct pour signaler la goroutine du générateur quand s'arrêter. Ceci est décrit dans le tutoriel Golang : https://tour.golang.org/concurrency/4.

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