„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Range-Over-Func in Go

Range-Over-Func in Go

Veröffentlicht am 29.08.2024
Durchsuche:539

range-over-func in Go

Go1.23 hat die Range-Over-Func-Funktion, die in go1.22 ein Experiment war, in die Praxis umgesetzt. Wenn jemand den Beispielcode gelesen hat, müssen Sie dies möglicherweise tun meditiere ein bisschen Tu das nicht. P'Yod wird es Ihnen auf sehr einfache Weise erklären, damit Sie es lesen können

Ausgehend von der Spezifikation von For-Anweisungen mit Bereichsklausel wurden drei Arten von Ausdrücken hinzugefügt:

func(func() bool)
func(func(V) bool)
func(func(K, V) bool)

Ich möchte eine Variable hinzufügen, um sie wie folgt zu erklären

f func(yield func() bool)
f func(yield func(V) bool)
f func(yield func(K, V) bool)

Die Spezifikation besagt, dass wir, wenn wir die Funktion f als Ausdruck in Rage verwenden, jedes Mal, wenn wir dort die Yield-Funktion aufrufen, bevor wir die Funktion f beenden, das Ergebnis in jeder Schleife erhalten. Entspricht dem Wert, den wir in den Ertrag eingefügt haben. Ich bin immer noch verwirrt, wenn ich es erkläre. Besser Code schreiben

func main() {
    for range loop {
        fmt.Println("-")
    }
}

func loop(yield func() bool) {
    yield()
    yield()
}

Ausgabe:

-
-

Wenn wir Code wie diesen schreiben, erhalten wir zwei vollständige Schleifen, da wir yield gemäß der Spezifikation zweimal in f aufrufen. Hier nennen wir es Schleife und es wird uns nichts zurückgegeben. Weil wir uns dafür entscheiden, ein Muster mit einem Ertrag zu verwenden, der keine Argumente akzeptiert

Ein weiteres Beispiel

func main() {
    for i := range loop {
        fmt.Println(i)
    }
}

func loop(yield func(int) bool) {
    yield(3)
    yield(7)
}

Ausgabe:

3
7

Auf diese Weise erhalten wir auch 2 Runden, da wir yield einmal aufrufen und jetzt range zwei Werte zurückgibt, nämlich 3 und 7, die wir jedes Mal verwenden, um yield aufzurufen

Ein weiteres Beispiel

func main() {
    for i := range loop {
        fmt.Println(i)
    }
}

func Loop(yield func(int, string) bool) {
    yield(3, "three")
    yield(5, "five")
    yield(7, "seven")
}

Ausgabe:

3 three
5 five
7 seven

Wir erhalten 3 Schleifen und 2 Werte pro Schleife, je nachdem, was wir jedes Mal in den Ertrag eingeben
Und wir können yield auch aufrufen, indem wir beliebige Argumenttypen wie
einfügen.

func loop(yield func(string, bool) bool) {
    yield("three", true)
    yield("five", false)
    yield("seven", false)
}

Jetzt verstehen wir den Mechanismus. Wenn wir schwierige Beispiele lesen, werden wir mehr verstehen, wie zum Beispiel das Beispiel im Go Wiki: Rangefunc Experiment

package slices

func Backward[E any](s []E) func(func(int, E) bool) {
    return func(yield func(int, E) bool) {
        for i := len(s)-1; i >= 0; i-- {
            if !yield(i, s[i]) {
                return
            }
        }
    }
}

hauptsächlich

s := []string{"hello", "world"}
for i, x := range slices.Backward(s) {
    fmt.Println(i, x)
}

Viel einfacher zu lesen, oder? Letztendlich liegt es an Ihnen, wie Sie es anwenden. Wir schauen uns nur an, wie oft die Rendite abgerufen wird. Sie erhalten es nur, wenn Sie es in Reichweite bringen
Der Wert, der dabei herauskommt, ist der Wert, der in die Ausbeute Ende

eingefügt wird.
Freigabeerklärung Dieser Artikel ist abgedruckt unter: https://dev.to/pallat/range-over-func-in-go-oof?1 Bei Verstößen wenden Sie sich bitte an [email protected], um ihn zu löschen
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3