Maison >développement back-end >Golang >Comment puis-je garantir des fonctions différées dans Go Print la valeur finale des variables ?
Clarification de l'utilisation différée
Introduction
Lors de l'utilisation de fonctions différées dans Go, il est crucial de comprendre comment les paramètres de fonction et les valeurs de retour sont gérés. Cet article vise à clarifier l'utilisation de defer dans des scénarios spécifiques.
Problème
Considérez la fonction suivante qui imprime un nombre à l'aide de l'instruction defer :
func printNumbers() { var x int defer fmt.Println(x) for i := 0; i < 5; i++ { x++ } }
Comme prévu, la fonction doit afficher "0" une fois terminée, car x est évalué et stocké avant l'exécution de la boucle for. Cependant, il peut y avoir des scénarios dans lesquels vous souhaitez imprimer la valeur finale de x.
Solution
Il existe plusieurs approches pour résoudre ce problème :
1. Fonction anonyme :
defer func() { fmt.Println(x) }()
Dans cette solution, une fonction anonyme est invoquée une fois la fonction principale terminée. Puisque x n'est pas un paramètre de la fonction anonyme, il est évalué lorsque la fonction est exécutée, reflétant la valeur finale de x.
2. Pointeur :
var x int defer Print(&x) // Function exists which prints the pointed value for i := 0; i < 5; i++ { x++ }
L'utilisation de pointeurs permet de différer l'adresse de x plutôt que sa valeur. Cela garantit que la valeur finale de x est imprimée puisque le différé contiendra l'adresse mise à jour.
3. Type personnalisé :
type MyInt int func (m *MyInt) String() string { return strconv.Itoa(int(*m)) } var x MyInt defer fmt.Println(&x) for i := 0; i < 5; i++ { x++ }
La création d'un type personnalisé qui implémente l'interface fmt.Stringer vous permet de contrôler la façon dont l'instruction defer imprime la valeur. Dans cet exemple, la méthode String() garantit que la valeur finale de x est imprimée.
4. Wrapping :
x := []int{0} defer fmt.Println(x) for i := 0; i < 5; i++ { x[0]++ }
Envelopper x dans une tranche garantit que le descripteur de tranche est copié et transmis à la fonction fmt.Println() une fois la boucle for terminée. Puisque le descripteur fait référence aux mêmes données sous-jacentes, la valeur finale de x est imprimée.
Conclusion
Comprendre les mécanismes du report est essentiel pour une utilisation efficace. En utilisant les approches décrites ci-dessus, vous pouvez différer l'évaluation des paramètres de fonction et vous assurer d'imprimer les valeurs souhaitées.
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!