Heim  >  Artikel  >  Backend-Entwicklung  >  Als Kanäle implementierte Generatoren im Python-Stil: Lesen zu früh

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

王林
王林nach vorne
2024-02-08 23:06:17330Durchsuche

作为通道实现的 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])
    }
}

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.

Lösung

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen