Heim >Backend-Entwicklung >Golang >Was ist der beste Weg, Iteratoren in Go zu erstellen: Kanäle, Abschlüsse oder benannte Typen?

Was ist der beste Weg, Iteratoren in Go zu erstellen: Kanäle, Abschlüsse oder benannte Typen?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-07 10:29:15746Durchsuche

What's the Best Way to Create Iterators in Go: Channels, Closures, or Named Types?

Erstellen von Iteratoren in Go: Kanäle vs. Schließungen vs. benannte Typen

In Go gibt es verschiedene Ansätze zum Erstellen von Iteratoren. Eine beliebte Option ist die Verwendung von Kanälen, die Iteratoren ähneln. Kanäle unterliegen jedoch Einschränkungen, insbesondere da sie ein Push-Modell statt eines Pull-Modells sind, was zu potenziellen Lecks führen kann.

Ein idiomatischer Ansatz beinhaltet die Verwendung von Schließungen. Das folgende Beispiel zeigt, wie man einen Iterator zum Generieren gerader Zahlen erstellt:

package main

import "fmt"

func main() {
    gen := newEven()
    fmt.Println(gen())
    fmt.Println(gen())
    fmt.Println(gen())
    gen = nil // release for garbage collection
}

func newEven() func() int {
    n := 0
    return func() int {
        n += 2
        return n
    }
}

Eine weitere Option ist die Verwendung benannter Typen mit Methoden:

package main

import "fmt"

func main() {
    gen := even(0)
    fmt.Println(gen.next())
    fmt.Println(gen.next())
    fmt.Println(gen.next())
}

type even int

func (e *even) next() int {
    *e += 2
    return int(*e)
}

Die Wahl zwischen Abschlüssen und benannten Typen hängt von ab spezifische Bedürfnisse. Abschlüsse bieten Flexibilität, während benannte Typen möglicherweise einen strukturierteren Ansatz bieten.

Außerdem ist die Verkettung von Iteratoren in Go unkompliziert, da Funktionen erstklassige Objekte sind. Das folgende Beispiel verkettet einen Generator für gerade Zahlen mit einer Quadratfunktion:

package main

import "fmt"

func main() {
    gen := mapInt(newEven(), square)
    fmt.Println(gen())
    fmt.Println(gen())
    fmt.Println(gen())
    gen = nil // release for garbage collection
}

type intGen func() int

func newEven() intGen {
    n := 0
    return func() int {
        n += 2
        return n
    }
}

func mapInt(g intGen, f func(int) int) intGen {
    return func() int {
        return f(g())
    }
}

func square(i int) int {
    return i * i
}

Das obige ist der detaillierte Inhalt vonWas ist der beste Weg, Iteratoren in Go zu erstellen: Kanäle, Abschlüsse oder benannte Typen?. 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