Maison >développement back-end >Golang >Appels différés : les arguments sont-ils évalués immédiatement ou lors de l'exécution de la fonction ?

Appels différés : les arguments sont-ils évalués immédiatement ou lors de l'exécution de la fonction ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-06 00:44:11570parcourir

Go Deferred Calls: Are Arguments Evaluated Immediately or Upon Function Execution?

Arguments de l'appel différé : évaluation immédiate vs exécution de fonction

Dans Go, un appel de fonction différé vous permet d'exécuter du code après le retour de la fonction environnante. Cependant, le comportement des appels différés peut prêter à confusion si vous ne comprenez pas comment les arguments sont traités.

Évaluation vs exécution

La citation de « A Tour of Go » indique que « le les arguments de l'appel différé sont évalués immédiatement, mais l'appel de fonction n'est pas exécuté jusqu'au retour de la fonction environnante. Cela signifie que :

  • Évaluation : Lorsque vous différez un appel de fonction, la valeur de la fonction et ses paramètres sont évalués et capturés. Cela se produit lorsque la fonction englobante est appelée.
  • Exécution : Une fois la fonction englobante renvoyée, la fonction différée est exécutée.

Explication de l'exemple

Examinons l'exemple fourni :

func def(s string) func() {
    fmt.Println("tier up")
    fmt.Println(s)
    return func() { fmt.Println("clean up") }
}

func main() {
    defer def("defered line")()
    fmt.Println("main")
}

Quand main() est appelée, ce qui suit se produit :

  1. L'instruction defer évalue l'argument de def, qui est la chaîne constante "ligne différée".
  2. La fonction def est appelée avec "ligne différée ," imprimant "niveau supérieur" et "ligne différée".
  3. La valeur de retour de def est une fonction qui imprime "nettoyer". Cette fonction n'est pas encore exécutée.
  4. main() imprime "main".
  5. Une fois main() renvoyé, la fonction différée est exécutée, imprimant "clean up".

Conclusion

Comprendre la distinction entre l'évaluation des arguments et l'exécution de la fonction est crucial pour utiliser efficacement les appels différés dans Go. Les arguments sont évalués immédiatement lorsque l'instruction defer est exécutée, tandis que le corps de la fonction n'est exécuté qu'au retour de la fonction englobante. Cela vous permet de contrôler l'ordre dans lequel les actions sont effectuées et d'éviter les problèmes potentiels liés à un comportement inattendu des fonctions.

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