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 ?

Comment fonctionne le mot-clé defer dans Go et quel problème résout-il dans cet exemple de code ?

DDD
DDDoriginal
2024-10-31 16:20:02596parcourir

How does the defer keyword work in Go and what problem does it solve in this code example?

Fonctionnement du mot-clé Defer dans Go

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.

Ordre d'évaluation

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().

Exemple concret

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.

Différer l'implémentation d'une fonctionnalité

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.

Solution au problème

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!

Déclaration:
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