Maison > développement back-end > Golang > Pourquoi la mesure du temps d'exécution des fonctions différées dans Go renvoie-t-elle des résultats inattendus ?

Pourquoi la mesure du temps d'exécution des fonctions différées dans Go renvoie-t-elle des résultats inattendus ?

Barbara Streisand
Libérer: 2024-11-20 11:47:51
original
861 Les gens l'ont consulté

Why Does Measuring Deferred Function Execution Time in Go Return Unexpected Results?

Mesure du temps d'exécution d'une fonction avec des fonctions différées dans Go

Dans Go, les fonctions différées fournissent un mécanisme pratique pour retarder l'exécution d'une fonction jusqu'à ce que la fonction environnante revient. Cependant, l'impression du temps nécessaire à l'exécution d'une fonction différée renvoie parfois des résultats inattendus.

Problème :

Considérez la fonction sum() suivante qui tente de calculer le temps d'exécution en utilisant une fonction différée :

func sum() {
    start := time.Now()

    //Expecting to print non-zero value but always gets 0
    defer fmt.Println(time.Now().Sub(start))

    sum := 0
    for i := 1; i < 101; i++ {
        sum += i
    }
    time.Sleep(1 * time.Second)
    fmt.Println(sum)
}
Copier après la connexion

L'exécution de ce code entraîne l'impression de 0 pour l'exécution time.

Solution :

Le problème se pose car les arguments de la fonction différée sont évalués lorsque la fonction est différée, et non lorsqu'elle est exécutée. Pour résoudre ce problème, utilisez une fonction anonyme pour capturer la valeur actuelle de start et différer l'exécution de cette fonction anonyme :

defer func() { fmt.Println(time.Now().Sub(start)) }()
Copier après la connexion

En utilisant une fonction anonyme, la valeur de start est évaluée au moment de l'exécution différée. la fonction est exécutée.

Autres considérations :

Si vous avez besoin de plus de personnalisation ou de flexibilité, envisagez d'encapsuler le logique de synchronisation dans une fonction réutilisable. Cette approche offre une solution plus modulaire et réutilisable.

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