Maison > développement back-end > Golang > Comment le report fonctionne-t-il avec les paramètres de fonction dans Go ?

Comment le report fonctionne-t-il avec les paramètres de fonction dans Go ?

Mary-Kate Olsen
Libérer: 2024-11-04 03:49:02
original
300 Les gens l'ont consulté

How does defer work with function parameters in Go?

Comprendre les subtilités du « defer » dans Go

Defer in Go est un mot-clé puissant qui vous permet de différer l'exécution d'une fonction appelez jusqu'à ce que la fonction englobante revienne. Cependant, lorsque vous travaillez avec defer, il est crucial de comprendre l'ordre d'évaluation des paramètres de fonction et des valeurs de retour.

Ordre d'évaluation et report

Selon la documentation sur Defer_statements, chaque fois qu'une instruction "defer" est exécutée, "la valeur de la fonction et les paramètres de l'appel sont évalués comme d'habitude et enregistrés à nouveau, mais la fonction réelle n'est pas invoquée." Cela signifie que lorsque vous appelez une fonction différée, les paramètres de la fonction sont évalués en premier, puis la fonction réelle est invoquée lors du retour de la fonction.

Scénario

Explorons dans un exemple spécifique où vous rencontrez des difficultés pour calculer correctement le prix du billet en fonction de l'âge de l'utilisateur. Votre code définit un appel différé à printTicket avec un argument ticketPrice. Vous vous attendez à ce que ticketPrice soit défini en fonction de l'âge indiqué et renvoie le prix du billet approprié.

Le problème

Le problème survient parce que vous essayez de réussir un "ticketPrice" non initialisé à printTicket. Lorsque l'appel différé à printTicket est exécuté lors du retour de main, le "ticketPrice" non initialisé entraînera une valeur nulle par défaut, provoquant uniquement l'impression du prix 9,99.

Solution

Pour résoudre ce problème, vous devez initialiser "ticketPrice" à la valeur correcte avant de différer l'appel à printTicket. Vous pouvez également utiliser une syntaxe d'appel de fonction modifiée qui vous permet de transmettre "ticketPrice" par référence, garantissant ainsi que l'appel différé obtient la valeur mise à jour.

Exemple

Voici une version modifiée de votre code qui démontre l'utilisation correcte de defer :

<code class="go">package main

import "fmt"

func printTicket(age int) float64 {
    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 main() {
    var age int
    defer fmt.Println("...order is 4...Your age is:", getAge(&age))
    // Modify the calling syntax here:
    var ticketPrice = 0.0
    defer fmt.Println("...order is 3...Your ticket price is:", printTicket(age, &ticketPrice)) 
}

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

Avec ces modifications, la variable "ticketPrice" sera correctement initialisée avant l'appel "printTicket", garantissant que le prix du billet est correct est calculé et imprimé.

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