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!