Maison >développement back-end >Golang >plage sur fonction dans Go
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 accordons au 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() }
sortie :
- -
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
Autre exemple
func main() { for i := range loop { fmt.Println(i) } } func loop(yield func(int) bool) { yield(3) yield(7) }
sortie :
3 7
Comme ça, nous obtiendrons également 2 tours car nous avons appelé rendement une fois et maintenant range renverra 2 valeurs qui sont 3 et 7 que nous utilisons pour appeler rendement à chaque fois
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") }
sortie :
3 three 5 five 7 seven
Nous obtiendrons 3 boucles et obtiendrons 2 valeurs à chaque fois en fonction du rendement que nous mettons à chaque fois
Et on peut aussi 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 lirons des exemples difficiles, nous 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) }
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 introduite dans le rendement. Fin
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!