Heim >Backend-Entwicklung >Golang >Können Go-Kanäle Python-Generatoren nachahmen?

Können Go-Kanäle Python-Generatoren nachahmen?

DDD
DDDOriginal
2024-11-12 11:56:02329Durchsuche

Can Go Channels Mimic Python Generators?

Generatoren im Python-Stil in Go

In Go können Goroutinen wie Python-Generatoren verwendet werden, wie in Frage 66 der Tour von veranschaulicht Gehen. Der bereitgestellte Code schreibt Frage 66 auf vereinfachte Weise um:

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. Eine Erhöhung der Puffergröße des Kanals führt aufgrund der Reduzierung zu einer Leistungssteigerung Kontextwechsel. Dies geht jedoch mit einer erhöhten Speichernutzung einher.
  2. Speicherverlust tritt auf, wenn Goroutinen nicht im Garbage Collection-Speicher erfasst werden. Im bereitgestellten Code bleibt die Fibonacci-Goroutine auf unbestimmte Zeit bestehen und verhindert, dass Kanal c im Garbage Collection gesammelt wird.

Alternativer Ansatz

Um diese Probleme zu beheben, berücksichtigen Sie Folgendes Folgender Code:

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

In diesem Beispiel:

  • Die fib-Funktion gibt einen Kanal zurück, der es dem Aufrufer ermöglicht, iterativ auf Fibonacci-Zahlen bis zu einem angegebenen Limit zuzugreifen.
  • Die Fibonacci-Goroutine schließt den Kanal, wenn er das Ende erreicht, und stellt so sicher, dass kein Speicherverlust auftritt.

Das obige ist der detaillierte Inhalt vonKönnen Go-Kanäle Python-Generatoren nachahmen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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