"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > 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 ?

Publié le 2024-11-06
Parcourir:546

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 :

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
}

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)[ La fonction &&&]
  2. fun 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 :

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 && age 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.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3