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