"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Pourquoi le «différer» affecte-t-il les valeurs de retour nommées différemment des paramètres d'entrée dans GO?

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

Publié le 2025-03-04
Parcourir:238

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

Comprendre les effets de la différence sur les déclarations de variables dans go

dans Go, l'utilisation du mot-clé de report permet aux fonctions d'exécuter du code au moment de leur retour, même si les paniques se produisent. Cependant, en ce qui concerne les variables déclarées de différentes manières d'une fonction, les résultats peuvent varier, conduisant à la confusion.

Le mystère de l'incrément de fuite

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 la passons la valeur 0. Cependant, lorsque nous imprimons le résultat, nous obtenons 0 plutôt que le 1. En effet. En effet, I est déclaré comme un paramètre d'entrée à la fonction. Une fois l'instruction de retour exécutée, la fonction de différence est appelée, mais l'incrément n'a aucun effet sur la valeur de retour.

la magie des résultats nommés

Contraste avec 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 RETOUR est exécutée, la valeur de I est définie sur la valeur de retour. Cependant, la fonction de différence est toujours autorisée à modifier la valeur de i avant son retour. Il en résulte que la sortie soit 1.

renvoie et modifications explicites

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, l'instruction RETOUR définit explicitement I à 2 avant que la fonction de différence ne soit appelée. En conséquence, la fonction de différence incrémente la valeur de i, et la valeur de retour devient 3.

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

Le point de mise à retenir de ces exemples est la distinction entre les paramètres d'entrée et les paramètres de résultat nommés. Les paramètres d'entrée sont transmis dans une fonction, tandis que les paramètres de résultat nommés sont des variables qui maintiennent les valeurs de retour de la fonction. Les fonctions de différence peuvent modifier les paramètres de résultat nommés après l'exécution de l'instruction de retour, mais ils ne peuvent pas affecter les paramètres d'entrée.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3