Maison > développement back-end > Golang > le corps du texte

Les canaux Go peuvent-ils imiter les générateurs Python ?

DDD
Libérer: 2024-11-12 11:56:02
original
281 Les gens l'ont consulté

Can Go Channels Mimic Python Generators?

Générateurs de style Python dans Go

Dans Go, les goroutines peuvent être utilisées comme des générateurs Python, comme illustré dans la question 66 du Tour de Aller. Le code fourni réécrit la question 66 de manière simplifiée :

package main

import "fmt"

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

Analyse

  1. L'augmentation de la taille du tampon du canal entraînera une amélioration des performances en raison de la réduction changement de contexte. Cependant, cela se fait au prix d'une utilisation accrue de la mémoire.
  2. Une fuite de mémoire se produit lorsque les goroutines ne sont pas récupérées. Dans le code fourni, la goroutine de Fibonacci persiste indéfiniment, empêchant le canal C d'être récupéré.

Approche alternative

Pour résoudre ces problèmes, considérez la code suivant :

package main

import "fmt"

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
}

func main() {
    for i := range fib(10) {
        fmt.Println(i)
    }
}
Copier après la connexion

Dans ce exemple :

  • La fonction fib renvoie un canal, permettant à l'appelant d'accéder de manière itérative aux numéros de Fibonacci jusqu'à une limite spécifiée.
  • La goroutine de fibonacci ferme le canal lorsqu'elle atteint la fin, garantissant qu'aucune fuite de mémoire ne se produit.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal