Gibt es eine idiomatische Iterator-Implementierung in Go?
Kanäle, die an Iteratoren erinnern, bieten Iteration über das Schlüsselwort „range“ an. Die Unfähigkeit, aus solchen Schleifen auszubrechen, ohne dass Goroutine-Lecks entstehen, schränkt jedoch ihren Nutzen ein. Auf der Suche nach einem idiomatischeren Iteratormuster haben Entwickler Fragen dazu gestellt, wie man ausdrucksstark iteriert und Iteratoren mit Operatoren wie Map, Filter und Reduce kombiniert.
Abschlussbasierter Ansatz
Obwohl Kanäle praktisch sind, erweisen sich Verschlüsse oft als besser geeignet. Abschlüsse ermöglichen die Erstellung von Iteratoren, die Werte nacheinander generieren. Hier ist ein Beispiel für die Erstellung eines Iterators für gerade Zahlen mithilfe eines Abschlusses:
func newEven() func() int { n := 0 return func() int { n += 2 return n } }
Methodenbasierter Ansatz
Wenn Ihnen Abschlüsse nicht gefallen, können Sie dies tun Verwenden Sie einen benannten Typ mit einer Methode:
type even int func (e *even) next() int { *e += 2 return int(*e) }
Kompromisse und Verkettung
Die Wahl zwischen Verschlüssen und Methoden erfordert Kompromisse. Abschlüsse sind flexibler, während Methoden eine explizitere Struktur bieten.
Die Verkettung ist in Go dank der erstklassigen Natur der Funktionen unkompliziert. Das folgende Beispiel zeigt, wie man einen geraden Zahlengenerator mit einer Quadrierungsfunktion verkettet:
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 vonWie kann ich Iteratoren in Go idiomatisch implementieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!