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
Libérer: 2024-10-29 20:32:03
original
1048 Les gens l'ont consulté

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

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

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!

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