Dans Go, lorsque vous utilisez le report avec différentes méthodes de déclaration de valeur, vous pouvez rencontrer des résultats inattendus. Cet article examine pourquoi defer produit différentes sorties pour différents styles d'attribution de valeur, fournissant une explication complète des mécanismes sous-jacents.
Le nœud du problème réside dans le distinction entre les paramètres de fonction et les paramètres de retour nommés. Dans l'exemple suivant :
func c(i int) int { defer func() { i++ }() return i }
i est un paramètre de fonction, passé dans la fonction. Au retour de la fonction, la valeur de i est évaluée et la fonction différée incrémente i. Cependant, ce changement n'a aucun impact sur la valeur renvoyée.
En revanche, la fonction suivante :
func c1() (i int) { defer func() { i++ }() return i }
définit i comme paramètre de retour nommé. Lorsque l'instruction return est exécutée, i est affecté à la valeur de retour, finalisant ainsi sa valeur. Cependant, la fonction différée est toujours capable de modifier i, ce qui entraîne l'incrément reflété dans la valeur de retour.
Pour illustrer davantage ce concept, considérons la fonction suivante :
func c2() (i int) { defer func() { i++ }() return 2 }
Ici, l'instruction return 2 définit explicitement i sur 2 avant que la fonction différée ait la possibilité de l'incrémenter. Par conséquent, la valeur renvoyée est 3, reflétant l'opération post-incrémentée par la fonction différée.
La spécification Go dicte que les fonctions différées sont exécutées après l'instruction return dans l'encadrant fonction. Cela signifie que si une instruction return définit explicitement les valeurs des paramètres de résultat nommés, les fonctions différées suivantes ont la possibilité de modifier ces valeurs avant qu'elles ne soient renvoyées.
Comprendre le comportement de defer avec différentes méthodes de déclaration de valeur sont essentielles pour créer du code Go fiable et prévisible. En reconnaissant les rôles distincts des paramètres de fonction et des paramètres de retour nommés, ainsi que l'impact potentiel des fonctions différées sur les valeurs de retour, vous pouvez éviter des résultats inattendus et écrire des programmes Golang plus efficaces.
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!