Maison  >  Article  >  développement back-end  >  Comment différer les paramètres de capture dans les fermetures Go ?

Comment différer les paramètres de capture dans les fermetures Go ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-10 17:53:02373parcourir

How Does Defer Capture Parameters in Go Closures?

Différer la capture en Go avec ou sans paramètres

En Go, le mot-clé defer peut être utilisé pour différer l'exécution d'une fonction jusqu'au retour de la fonction environnante. Cependant, lorsqu'il est utilisé avec des fermetures anonymes, le comportement peut varier en fonction de la façon dont la fermeture capture ses paramètres.

Considérez le code suivant :

import "fmt"

func main() {
    var whatever [5]struct{}

    for i := range whatever {
        fmt.Println(i)
    } // part 1

    for i := range whatever {
        defer func() { fmt.Println(i) }()
    } // part 2

    for i := range whatever {
        defer func(n int) { fmt.Println(n) }(i)
    } // part 3
}

Partie 2 : Fermeture sans paramètre

Dans la partie 2, la fermeture ne capture aucun paramètre. Cela signifie que lorsque la fermeture est exécutée, la variable i a la valeur qu'elle avait lors de l'exécution de l'instruction defer. Dans ce cas, j'aurai la valeur de la dernière itération de la boucle for, qui est 4. Par conséquent, le résultat de la partie 2 sera :

4 4 4 4 4

Partie 3 : Fermeture avec paramètre

Dans la partie 3, la fermeture capture le paramètre n, qui est initialisé à la valeur de i lors de la création de la fermeture. Cela signifie que lorsque la fermeture est exécutée, n aura la valeur qu'il avait lors de l'exécution de l'instruction defer. Dans ce cas, chaque fermeture capture une valeur différente de i, ce qui donne le résultat :

4 3 2 1 0

Conclusion

La principale différence entre la partie 2 et la partie 3 est que la partie 2 capture le i variable alors que la partie 3 ne le fait pas. Cela affecte le comportement de la fermeture lorsqu'elle est exécutée, conduisant à des sorties différentes.

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