Heim > Backend-Entwicklung > Golang > Was ist der idiomatischste Weg, Iteratoren in Go zu erstellen?

Was ist der idiomatischste Weg, Iteratoren in Go zu erstellen?

Mary-Kate Olsen
Freigeben: 2024-12-01 17:32:14
Original
433 Leute haben es durchsucht

What's the Most Idiomatic Way to Create Iterators in Go?

Die idiomatische Art, Iteratoren in Go zu konstruieren

Kanäle bieten einen kanalähnlichen Mechanismus für die Iteration. Sie haben zwar Einschränkungen, etwa dass sie nicht aus der Iteration ausbrechen können, ohne Goroutine-Lecks zu riskieren, sie sind jedoch nicht die idiomatische Art, Iteratormuster in Go zu erstellen. Für diesen Zweck sind Abschlüsse besser geeignet.

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
    // closure captures variable n
    return func() int {
        n += 2
        return n
    }
}
Nach dem Login kopieren

Eine weitere Möglichkeit besteht darin, benannte Typen mit Methoden zu verwenden.

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

Das Verketten von Generatoren ist aufgrund der erstklassigen Funktionen von Go unkompliziert. Hier ist ein Beispiel:

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

Zusammenfassend lässt sich sagen, dass es zwar mehrere Techniken zum Erstellen von Iteratoren in Go gibt, der idiomatische Ansatz jedoch Abschlüsse oder benannte Typen mit Methoden umfasst. Die Wahl zwischen diesen hängt von den spezifischen Bedürfnissen und Kompromissen ab.

Das obige ist der detaillierte Inhalt vonWas ist der idiomatischste Weg, Iteratoren in Go zu erstellen?. 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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage