Heim >Backend-Entwicklung >Golang >Als Kanäle implementierte Generatoren im Python-Stil: Lesen zu früh
php-Editor Youzi hat einen Artikel über den Python-Stilgenerator für die Kanalimplementierung mitgebracht. In diesem Beitrag stellen wir das Konzept des vorzeitigen Lesens und die Verwendung von Kanälen zur Implementierung von Generatoren im Python-Stil vor. Auf diese Weise können wir eine Generatorsyntax in PHP verwenden, die der in Python ähnelt, und so ein flexibleres und effizienteres Programmiererlebnis bieten. Ganz gleich, ob Sie PHP-Entwickler sind oder sich für Generatoren interessieren, dieser Artikel liefert Ihnen wertvolles Wissen und praktische Tipps. Lassen Sie uns gemeinsam dieses interessante Thema erkunden!
Ich versuche, einen Generator im Python-Stil über den folgenden Kanal zu implementieren:
package main import ( "fmt" ) type ContainerIterable[T any] struct { content []T } func NewContainerIterable[T any]() *ContainerIterable[T] { return &ContainerIterable[T]{content: make([]T, 0)} } func (c *ContainerIterable[T]) Iterate() chan T { ch := make(chan T) go func() { for _, v := range c.content { ch <- v } close(ch) }() return ch } func (c *ContainerIterable[T]) Add(e T) { c.content = append(c.content, e) } func main() { c := NewContainerIterable[int]() for i := 0; i < 5; i++ { c.Add(i) } r := make([]int, 0) for v := range c.Iterate() { r = append(r, v) } for i := 0; i < 5; i++ { fmt.Println(i, r[i], i == r[i]) } }
Das funktioniert super, die Ausgabe ist
0 0 true 1 1 true 2 2 true 3 3 true 4 4 true
Aber wenn ich mich verändere
r := make([]int, 0)
zu
r := make([]int, 5)
Die Ergebnisse sind unterschiedlich:
0 0 true 1 0 false 2 0 false 3 0 false 4 0 false
Ich weiß, dass c.Iterate()
im zweiten Fall vorher mit dem Lesen vom Kanal beginnt
go func() { for _, v := range c.content { ch <- v }
Möglichkeit, beliebige Inhalte an den Kanal zu senden.
Dies funktioniert im ersten Fall nicht, da das Slice beim Aufruf von append()
时,main()
goroutine 需要一些时间来为 r
den Speicherplatz neu zuweist.
Bitte geben Sie an, wie ich meinen Code anpassen kann, damit Iterate()
ordnungsgemäß funktioniert.
Dies:
r := make([]int, 5)
initialisiert ein Slice mit 5 Elementen, alle 0. Anschließend fügen Sie 5 weitere Elemente hinzu. Ihr Programm liest die ersten 5 Nullelemente.
Verwendung: r:=make([]int,0,5)
Das obige ist der detaillierte Inhalt vonAls Kanäle implementierte Generatoren im Python-Stil: Lesen zu früh. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!