Comprendre les subtilités du « defer » dans Go
Defer in Go est un mot-clé puissant qui vous permet de différer l'exécution d'une fonction appelez jusqu'à ce que la fonction englobante revienne. Cependant, lorsque vous travaillez avec defer, il est crucial de comprendre l'ordre d'évaluation des paramètres de fonction et des valeurs de retour.
Ordre d'évaluation et report
Selon la documentation sur Defer_statements, chaque fois qu'une instruction "defer" est exécutée, "la valeur de la fonction et les paramètres de l'appel sont évalués comme d'habitude et enregistrés à nouveau, mais la fonction réelle n'est pas invoquée." Cela signifie que lorsque vous appelez une fonction différée, les paramètres de la fonction sont évalués en premier, puis la fonction réelle est invoquée lors du retour de la fonction.
Scénario
Explorons dans un exemple spécifique où vous rencontrez des difficultés pour calculer correctement le prix du billet en fonction de l'âge de l'utilisateur. Votre code définit un appel différé à printTicket avec un argument ticketPrice. Vous vous attendez à ce que ticketPrice soit défini en fonction de l'âge indiqué et renvoie le prix du billet approprié.
Le problème
Le problème survient parce que vous essayez de réussir un "ticketPrice" non initialisé à printTicket. Lorsque l'appel différé à printTicket est exécuté lors du retour de main, le "ticketPrice" non initialisé entraînera une valeur nulle par défaut, provoquant uniquement l'impression du prix 9,99.
Solution
Pour résoudre ce problème, vous devez initialiser "ticketPrice" à la valeur correcte avant de différer l'appel à printTicket. Vous pouvez également utiliser une syntaxe d'appel de fonction modifiée qui vous permet de transmettre "ticketPrice" par référence, garantissant ainsi que l'appel différé obtient la valeur mise à jour.
Exemple
Voici une version modifiée de votre code qui démontre l'utilisation correcte de defer :
<code class="go">package main import "fmt" func printTicket(age int) float64 { fmt.Println("...order is 2...") switch { case age <= 13: return 9.99 case age > 13 && age < 65: return 19.99 default: return 12.99 } } func main() { var age int defer fmt.Println("...order is 4...Your age is:", getAge(&age)) // Modify the calling syntax here: var ticketPrice = 0.0 defer fmt.Println("...order is 3...Your ticket price is:", printTicket(age, &ticketPrice)) } func getAge(age *int) int { fmt.Println("...order is 1...") fmt.Print("Enter age=") fmt.Scanln(age) return *age }</code>
Avec ces modifications, la variable "ticketPrice" sera correctement initialisée avant l'appel "printTicket", garantissant que le prix du billet est correct est calculé et imprimé.
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!