Maison > Article > développement back-end > Comment fonctionne le mot-clé defer dans Go et quel problème résout-il dans cet exemple de code ?
Dans Go, le mot-clé defer est utilisé pour différer l'exécution d'un appel de fonction jusqu'au retour de la fonction environnante. Les paramètres et la valeur de la fonction de l'appel différé sont évalués comme d'habitude lorsque l'instruction defer est exécutée, mais la fonction réelle est invoquée juste avant l'instruction return de la fonction environnante.
L'évaluation l'ordre des instructions avec le mot-clé defer suit une approche du dernier entré, premier sorti (LIFO). Par exemple, considérons le code suivant :
<code class="go">defer func1()() defer func2()() fmt.Println("main function")</code>
Dans cet exemple, l'appel à func1() sera différé et exécuté immédiatement avant le retour de la fonction principale. De même, l'appel à func2() sera différé et exécuté avant l'appel à func1().
Un cas d'utilisation courant du report consiste à libérer automatiquement des ressources avant un la fonction revient. Par exemple, un descripteur de fichier peut être ouvert au début d'une fonction et fermé à l'aide de defer avant le retour de la fonction.
Considérez l'exemple du problème :
<code class="go">defer fmt.Println("Your age is:", getAge(age)) // calls getAge defer fmt.Println("Your ticket price is:", printTicket(age, ticketprice)) // calls printTicket</code>
Dans ce code, l'appel à getAge() est différé avant l'appel à printTicket(). Cela signifie que l'évaluation de l'âge et le calcul du ticketPrice auront lieu immédiatement, tandis que l'impression réelle de l'âge et du prix du billet sera différée jusqu'au retour de la fonction.
En utilisant defer, vous pouvez vous assurer que l'âge et le prix du billet sont toujours imprimés, même si une erreur se produit lors de l'exécution de la fonction.
Le code d'origine du problème présentait un problème où la fonction printTicket n'était pas appelée correctement pour les âges supérieurs à 13 ans. En effet, la variable ticketPrice était déclarée mais n'avait jamais reçu de valeur. En utilisant le report, nous pouvons garantir que le prix du billet est calculé correctement avant son impression.
Voici une version corrigée du code :
<code class="go">package main import "fmt" func main() { var age int defer fmt.Println("Your age is:", getAge(&age)) defer fmt.Println("Your ticket price is:", printTicket(age)) } func printTicket(age int) float64 { var ticketPrice float64 switch { case age <= 13: ticketPrice = 9.99 case age > 13 && age < 65: ticketPrice = 19.99 case age >= 65: ticketPrice = 12.99 } return ticketPrice } func getAge(age *int) int { fmt.Println("What is your age?") fmt.Scan(age) for *age < 0 || *age > 100 { fmt.Println("That cannot be, please enter your age again") fmt.Scan(age) } return *age }</code>
Avec ce correctif, le code sera correctement imprimez le prix du billet en fonction de l'âge de l'utilisateur.
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!