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

plage sur fonction dans Go

WBOY
Libérer: 2024-08-19 04:42:32
original
532 Les gens l'ont consulté

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)
Copier après la connexion

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)
Copier après la connexion

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()
}
Copier après la connexion

sortie :

-
-
Copier après la connexion

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)
}
Copier après la connexion

sortie :

3
7
Copier après la connexion

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")
}
Copier après la connexion

sortie :

3 three
5 five
7 seven
Copier après la connexion

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)
}
Copier après la connexion

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
            }
        }
    }
}
Copier après la connexion

principal

s := []string{"hello", "world"}
for i, x := range slices.Backward(s) {
    fmt.Println(i, x)
}
Copier après la connexion

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!

source:dev.to
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal