Lors du report de l'exécution d'une fonction dans Go, il est crucial de comprendre le comportement d'évaluation. Comme indiqué dans la spécification, les paramètres et la valeur de la fonction sont immédiatement évalués lorsque l'instruction defer est rencontrée. Cela peut conduire à des résultats inattendus, en particulier lors de l'utilisation de defer avec des variables modifiées au sein de la fonction.
Considérez la fonction suivante :
func printNumbers() { var x int defer fmt.Println(x) for i := 0; i < 5; i++ { x++ } }
Le L'intention de cette fonction est d'imprimer la valeur finale de x (5) à la fin de l'exécution de la fonction. Cependant, en raison de l'évaluation immédiate de x lors de l'instruction différée, zéro sera imprimé à la place.
Pour résoudre ce problème, plusieurs solutions alternatives existent :
1. Fonction anonyme :
Au lieu de différer la fonction d'origine, créez une fonction anonyme qui capture et imprime la valeur actuelle de x.
func printNumbers() { var x int defer func() { fmt.Println(x) }() for i := 0; i < 5; i++ { x++ } }
2. Pointeur :
Utilisez un pointeur vers x pour différer la valeur réelle. Puisque seule l'adresse est évaluée lors de l'instruction différée, la valeur finale de x sera imprimée.
func printNumbers() { var x int defer fmt.Println(&x) for i := 0; i < 5; i++ { x++ } } func Print(i *int) { fmt.Println(*i) }
3. Type personnalisé :
Créez un type personnalisé implémentant fmt.Stringer. Cela permet au type de définir comment il doit être imprimé, garantissant que la valeur correcte est affichée.
type MyInt int func (m *MyInt) String() string { return strconv.Itoa(int(*m)) } func printNumbers() { var x MyInt defer fmt.Println(&x) for i := 0; i < 5; i++ { x++ } }
4. Tranches :
Les tranches sont des descripteurs qui font référence à la structure de données sous-jacente. En différant une tranche qui contient la variable, la valeur finale modifiée sera imprimée.
func printNumbers() { x := []int{0} defer fmt.Println(x) for i := 0; i < 5; i++ { x[0]++ } }
Comprendre le comportement d'évaluation immédiat des exécutions de fonctions différées est essentiel pour utiliser efficacement le report. Les solutions fournies démontrent diverses approches pour garantir que les valeurs prévues sont imprimées lors du report de l'exécution d'une fonction.
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!