Heim  >  Artikel  >  Backend-Entwicklung  >  Range-Over-Func in Go

Range-Over-Func in Go

WBOY
WBOYOriginal
2024-08-19 04:42:32498Durchsuche

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 das vielleicht 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 die Yield-Funktion dort aufrufen, bevor wir die Funktion f beenden, das Ergebnis in jeder Schleife erhalten. Entspricht dem Wert, den wir auf den Ertrag legen. Ich bin immer noch verwirrt, wenn ich es erkläre. Schreiben Sie besser Code

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, das keine Argumente akzeptiert

Noch ein 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 einmal „Yield“ aufgerufen haben und nun „Range“ zwei Werte zurückgibt, nämlich 3 und 7, die wir jedes Mal zum Aufrufen von „Yield“ verwenden

Noch ein 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 erhalten jedes Mal 2 Werte entsprechend der Ausbeute, die wir jedes Mal eingeben
Und wir können yield auch aufrufen, indem wir beliebige Argumente 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
            }
        }
    }
}

Haupt

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

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 Rendite einfließt. Das ist alles

Das obige ist der detaillierte Inhalt vonRange-Over-Func in Go. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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