Maison > développement back-end > Golang > Comment puis-je garantir des fonctions différées dans Go Print la valeur finale des variables ?

Comment puis-je garantir des fonctions différées dans Go Print la valeur finale des variables ?

Barbara Streisand
Libérer: 2024-12-18 03:32:10
original
125 Les gens l'ont consulté

How Can I Ensure Deferred Functions in Go Print the Final Value of 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++
  }
}
Copier après la connexion

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

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(&amp;x) // Function exists which prints the pointed value

for i := 0; i < 5; i++ {
  x++
}
Copier après la connexion

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(&amp;x)

for i := 0; i < 5; i++ {
  x++
}
Copier après la connexion

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

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!

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