Maison >développement back-end >Golang >Les canaux Go peuvent-ils imiter les générateurs Python ?

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

DDD
DDDoriginal
2024-11-12 11:56:02328parcourir

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

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

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!

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