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