Maison > développement back-end > Golang > Pourquoi « defer » affecte-t-il les valeurs de retour nommées différemment des paramètres d'entrée dans Go ?

Pourquoi « defer » affecte-t-il les valeurs de retour nommées différemment des paramètres d'entrée dans Go ?

Barbara Streisand
Libérer: 2024-11-29 00:18:12
original
573 Les gens l'ont consulté

Why Does `defer` Affect Named Return Values Differently Than Input Parameters in Go?

Comprendre les effets du report sur les déclarations de variables en Go

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.

Le mystère de l'incrément qui disparaît

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
}
Copier après la connexion

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.

La magie des résultats nommés

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
}
Copier après la connexion

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.

Retours explicites et modifications différées

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
}
Copier après la connexion

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.

La puissance des paramètres de résultat nommés

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal