Maison >développement back-end >Golang >plage sur fonction dans Go

plage sur fonction dans Go

WBOY
WBOYoriginal
2024-08-19 04:42:32530parcourir

range-over-func in 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Article précédent:Go Redis Crud exemple rapideArticle suivant:Go Redis Crud exemple rapide