Heim > Backend-Entwicklung > Golang > Wie kann ich Generatoren im Python-Stil in Go implementieren?

Wie kann ich Generatoren im Python-Stil in Go implementieren?

DDD
Freigeben: 2024-11-19 11:25:03
Original
893 Leute haben es durchsucht

How Can I Implement Python-Style Generators in Go?

Generatoren im Python-Stil in Go

Implementierung

In Python sind Generatoren praktische Konstrukte zum Erstellen von Iteratoren. Goroutinen in Go bieten ähnliche Funktionen. Hier ist eine Go-Implementierung eines Generators im Python-Stil für die Fibonacci-Sequenz:

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)
    }
}
Nach dem Login kopieren

Leistung und Speicherverwaltung

Puffergröße:

Zunehmend Die Puffergröße des Kanals (z. B. auf 10) wird wahrscheinlich die Leistung verbessern, indem Kontextwechsel reduziert werden. Dies geht jedoch zu Lasten des Speicherverbrauchs.

Speicherverwaltung:

Im obigen Code läuft die Fibonacci-Goroutine unbegrenzt und wartet auf Lesevorgänge vom Kanal c . Der Kanal c ist nicht geschlossen, was zu Speicherlecks führt. Hier ist eine alternative Implementierung, die dieses Problem behebt:

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
}
Nach dem Login kopieren

In diesem Fall wird die Goroutine beendet, wenn n Fibonacci-Zahlen generiert wurden. Der Kanal wird geschlossen, was zu seiner Bereinigung durch den Garbage Collector führt.

Andere Überlegungen

Für Szenarien, in denen die Anzahl der generierten Werte unbekannt ist, sollten Sie die Verwendung eines separaten Beendigungskanals in Betracht ziehen, um der Generator-Goroutine zu signalisieren wann man aufhört. Dies wird im Golang-Tutorial beschrieben: https://tour.golang.org/concurrency/4.

Das obige ist der detaillierte Inhalt vonWie kann ich Generatoren im Python-Stil in Go implementieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage