Als Kanäle implementierte Generatoren im Python-Stil: Lesen zu früh

王林
Freigeben: 2024-02-08 23:06:17
nach vorne
329 Leute haben es durchsucht

作为通道实现的 Python 风格生成器:过早阅读

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!

Frageninhalt

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

Das funktioniert super, die Ausgabe ist

0 0 true
1 1 true
2 2 true
3 3 true
4 4 true
Nach dem Login kopieren

Aber wenn ich mich verändere

r := make([]int, 0)
Nach dem Login kopieren

zu

r := make([]int, 5)
Nach dem Login kopieren
Nach dem Login kopieren

Die Ergebnisse sind unterschiedlich:

0 0 true
1 0 false
2 0 false
3 0 false
4 0 false
Nach dem Login kopieren

Ich weiß, dass c.Iterate() im zweiten Fall vorher mit dem Lesen vom Kanal beginnt

go func() {
        for _, v := range c.content {
            ch <- v
        }
Nach dem Login kopieren

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.

Lösung

Dies:

r := make([]int, 5)
Nach dem Login kopieren
Nach dem Login kopieren

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!

Quelle:stackoverflow.com
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!