En Go, l'utilisation du mot-clé defer permet aux fonctions d'exécuter du code au moment de leur retour, même si des paniques surviennent. Cependant, lorsqu'il s'agit de variables déclarées de différentes manières au sein d'une fonction, les résultats peuvent varier, conduisant à une confusion.
Considérez l'extrait de code suivant :
func c(i int) int { defer func() { i++ }() return i } func main() { fmt.Println(c(0)) // Prints 0 }
Dans cet exemple, nous appelons la fonction c et lui passons la valeur 0. Cependant, lorsque nous imprimons le résultat, nous obtenons 0 plutôt que la valeur attendue 1. C'est parce que i est déclaré comme paramètre d'entrée de la fonction. Une fois l'instruction return exécutée, la fonction defer est appelée, mais l'incrément n'a aucun effet sur la valeur de retour.
Contrairement à l'exemple précédent, considérons le code suivant :
func c1() (i int) { defer func() { i++ }() return i } func main() { fmt.Println(c1()) // Prints 1 }
Ici, i est déclaré comme paramètre de résultat pour la fonction c1. Lorsque l'instruction return est exécutée, la valeur de i est définie sur la valeur de retour. Cependant, la fonction defer est toujours autorisée à modifier la valeur de i avant qu'elle ne soit renvoyée. Il en résulte que la sortie est 1.
Pour illustrer davantage ce comportement, ajoutons un autre exemple :
func c2() (i int) { defer func() { i++ }() return 2 } func main() { fmt.Println(c2()) // Prints 3 }
Dans cet exemple, le L'instruction return définit explicitement i sur 2 avant que la fonction defer ne soit appelée. En conséquence, la fonction defer incrémente la valeur de i et la valeur de retour devient 3.
Le principal point à retenir de ces exemples est la distinction entre les paramètres d'entrée et des paramètres de résultat nommés. Les paramètres d'entrée sont transmis à une fonction, tandis que les paramètres de résultat nommés sont des variables qui contiennent les valeurs de retour de la fonction. Les fonctions de report peuvent modifier les paramètres de résultat nommés après l'exécution de l'instruction return, mais elles ne peuvent pas affecter les paramètres d'entrée.
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!