Dans Go, l'instruction defer est utilisée pour planifier l'exécution d'une fonction après l'environnement. la fonction revient. Cependant, lorsqu'il s'agit d'accéder et de modifier les valeurs des variables dans la fonction différée, le comportement peut varier en fonction de la manière dont les variables sont déclarées.
Cas 1 : Variable déclarée comme paramètre entrant
Considérons l'exemple suivant :
func c(i int) int { defer func() { i++ }() return i }
Ici, i est déclaré comme paramètre entrant. Lorsque l'instruction return est exécutée, la valeur de retour est évaluée et la fonction différée s'exécute après ceci. Par conséquent, l'incrémentation de i dans la fonction différée n'a aucun effet sur la valeur de retour, et c(0) affichera 0.
Cas 2 : Variable déclarée comme paramètre de résultat
Regardons maintenant cet exemple :
func c1() (i int) { defer func() { i++ }() return i }
Dans ce cas, i est déclaré comme nom du paramètre de résultat. Lorsque l'instruction return est exécutée, la valeur de i est explicitement renvoyée. La fonction différée est alors autorisée à modifier la valeur de i, ce qui affecte la valeur réelle renvoyée. C'est pourquoi c1() imprime 1.
Cas 3 : paramètre de résultat avec valeur de retour explicite
Pour illustrer davantage, considérons cet exemple :
func c2() (i int) { defer func() { i++ }() return 2 }
Ici, même si la fonction defer modifie i, l'instruction return explicite attribue la valeur 2 à i avant l'exécution de la fonction defer. En conséquence, c2() renvoie 3.
Conclusion
La clé à retenir est que dans Go, si une fonction a nommé des paramètres de résultat, les valeurs de retour sont les valeurs de ces variables. Cependant, une instruction return peut attribuer de nouvelles valeurs à ces paramètres de résultat, et les fonctions différées peuvent les modifier après l'instruction return, affectant les valeurs renvoyées réelles.
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!