Maison > développement back-end > Golang > le corps du texte

Pourquoi ma déclaration de report ne produit-elle pas le prix du billet attendu en Go ?

Susan Sarandon
Libérer: 2024-10-30 18:30:18
original
320 Les gens l'ont consulté

Why Does My Defer Statement Not Produce the Expected Ticket Price in 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))
Copier après la connexion

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

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!

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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!