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