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