Maison > Article > développement back-end > Pourquoi ma déclaration de report ne produit-elle pas le prix du billet attendu en Go ?
Comment fonctionne le mot-clé defer dans Go
Dans Go, le mot-clé defer vous permet de retarder l'exécution d'une fonction ou d'une instruction jusqu'à ce que l'environnement la fonction revient. Cependant, la valeur et les paramètres de la fonction différée sont évalués immédiatement et liés à l'appel de fonction au moment de l'instruction defer.
Comprendre l'ordre d'évaluation différée
Par exemple, le code suivant :
defer fmt.Println("Your age is:", getAge(age))
diffère l'exécution de la fonction fmt.Println et lie la valeur de age au moment de l'instruction defer. Cependant, l'appel réel de la fonction fmt.Println sera exécuté dans l'ordre inverse juste avant le retour de la fonction environnante.
Application dans un calcul du prix d'un billet
Dans votre cas, vous souhaitez calculer le prix du billet en fonction de l'âge de l'utilisateur :
defer fmt.Println("Your ticket price is:", printTicket(age, ticketPrice))
Ici, la déclaration de report lie la valeur de l'âge et du ticketPrice au moment de la déclaration de report. Lorsque la fonction principale revient, printTicket sera appelé avec les valeurs liées de age et ticketPrice. Cependant, comme seule l'instruction if pour l'âge <= 13 est en cours d'exécution, elle n'imprime que 9,99.
Résolution du problème
Pour résoudre le problème, assurez-vous que toutes les conditions nécessaires dans printTicket sont évaluées avant que la fonction ne soit différée. Voici une version modifiée :
defer fmt.Println(*age) if *age <= 13 { ticketPrice = 9.99 } else if *age > 13 && *age < 65 { ticketPrice = 19.99 } else if *age >= 65 { ticketPrice = 12.99 } defer fmt.Println(ticketPrice)Maintenant, fmt.Println(*age) et fmt.Println(ticketPrice) seront différés et exécutés dans l'ordre inverse, affichant l'âge et le prix du billet corrects.
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!