Go1.23 a permis d'utiliser réellement la fonctionnalité range-over-func qui était une expérience dans go1.22. Si quelqu'un a lu l'exemple de code, vous devrez peut-être le faire. méditez un peu. Ne fais pas ça. P'Yod vous expliquera de manière très simple à lire
À partir de la spécification des instructions For avec clause range, 3 types d'expressions ont été ajoutés :
func(func() bool) func(func(V) bool) func(func(K, V) bool)
Je voudrais ajouter une variable pour expliquer comme suit
f func(yield func() bool) f func(yield func(V) bool) f func(yield func(K, V) bool)
La spécification dit que lorsque nous utilisons la fonction f comme expression de rage, chaque fois que nous y appelons la fonction rendement avant de terminer la fonction f, nous obtenons le résultat dans chaque boucle. Égal à la valeur que nous avons insérée dans le rendement, je suis toujours confus lorsque je l'explique. Mieux vaut écrire du code
func main() { for range loop { fmt.Println("-") } } func loop(yield func() bool) { yield() yield() }
sortir:
- -
Si nous écrivons du code comme celui-ci, nous obtiendrons 2 boucles complètes car nous appelons rendement 2 fois dans f selon la spécification, ici nous l'appelons boucle et il ne nous retournera rien. Parce que nous choisissons d'utiliser un modèle avec un rendement qui n'accepte aucun argument
Un autre exemple
func main() { for i := range loop { fmt.Println(i) } } func loop(yield func(int) bool) { yield(3) yield(7) }
sortir:
3 7
De cette façon, nous obtiendrons également 2 tours car nous appelons rendement une fois et maintenant la plage renverra 2 valeurs qui sont 3 et 7 que nous utilisons pour appeler rendement à chaque fois
Un autre exemple
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") }
sortir:
3 three 5 five 7 seven
Nous obtiendrons 3 boucles et obtiendrons 2 valeurs par boucle en fonction de ce que nous mettons dans le rendement à chaque fois
Et nous pouvons également appeler rendement en insérant tout type d'arguments tels que
func loop(yield func(string, bool) bool) { yield("three", true) yield("five", false) yield("seven", false) }
Maintenant que nous en comprenons le mécanisme. Lorsque nous lisons des exemples difficiles, nous en comprendrons davantage, comme l'exemple du 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 } } } }
principal
s := []string{"hello", "world"} for i, x := range slices.Backward(s) { fmt.Println(i, x) }
Beaucoup plus facile à lire, non ? En fin de compte, c’est à vous de décider comment l’appliquer. Nous regardons uniquement combien de fois le rendement est appelé. Vous ne l'obtiendrez que lorsque vous le mettrez à portée
La valeur qui sortira est la valeur déposée dans le rendement End
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3