Maison >développement back-end >Golang >Comment fonctionne le mot-clé Defer de Go dans l'ordre d'exécution de fonction ?

Comment fonctionne le mot-clé Defer de Go dans l'ordre d'exécution de fonction ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-29 20:32:031049parcourir

How Does Go's Defer Keyword Work in Function Execution Order?

Comprendre la fonctionnalité du mot-clé Defer de Go

Lorsque vous travaillez avec Go, il est crucial de comprendre le comportement du mot-clé defer. Ce mot-clé permet aux développeurs de différer l'exécution d'une fonction jusqu'au retour de la fonction environnante. Cependant, il est important de noter que la valeur et les paramètres de la fonction sont évalués lors de l'exécution de l'instruction defer.

Exemple : évaluation de l'ordre de report

Pour illustrer cela, considérez ce qui suit code :

<code class="go">package main

import "fmt"

func main() {
    defer having()(fun("with Go."))
    fmt.Print("some ") // evaluation order: 3
}

func having() func(string) {
    fmt.Print("Go ") // evaluation order: 1
    return funWithGo
}

func fun(msg string) string {
    fmt.Print("have ") // evaluation order: 2
    return msg
}

func funWithGo(msg string) {
    fmt.Println("fun", msg) // evaluation order: 4
}</code>

Dans cet exemple, le code est exécuté dans l'ordre suivant :

  1. avoir une fonction est évalué et renvoie une fonction qui prend une chaîne en entrée (ordre d'évaluation : 1)
  2. la fonction amusante est évaluée avec le "with Go". chaîne en entrée (ordre d'évaluation : 2)
  3. fmt.Print("some ") est exécuté (ordre d'évaluation : 3)
  4. defer appelle la fonction funWithGo avec le résultat de fun (ordre d'évaluation : 4)

Application du principe de report

Pour résoudre le problème mentionné dans la requête d'origine, nous pouvons utiliser le mot-clé defer pour imprimer correctement le prix du billet en fonction sur l'âge saisi. Vous trouverez ci-dessous une version modifiée du code :

<code class="go">package main

import "fmt"

func main() {
    age := 999
    defer fmt.Println("Your age is:", getAge(&age)) // defer printing the age
    defer fmt.Println("Your ticket price is:", getTicketPrice(age)) // defer printing the ticket price
}

func getTicketPrice(age int) float64 {
    // Calculate ticket price based on age
    // logic can be customized here
    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 getAge(age *int) int {
    fmt.Println("...order is 1...")
    fmt.Print("Enter age=")
    fmt.Scanln(age)
    return *age
}</code>

Dans ce code modifié, nous exploitons correctement le mot-clé defer pour garantir que l'âge et le prix du billet sont imprimés après l'exécution des fonctions respectives, résolvant ainsi le problème initial. .

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