Maison > développement back-end > Golang > Pourquoi l'opérateur `==` de Go ne parvient-il pas à comparer correctement les structures `time.Time`, et comment les méthodes `Time.Equal()` et `Time.In()` peuvent-elles résoudre ce problème ?

Pourquoi l'opérateur `==` de Go ne parvient-il pas à comparer correctement les structures `time.Time`, et comment les méthodes `Time.Equal()` et `Time.In()` peuvent-elles résoudre ce problème ?

Linda Hamilton
Libérer: 2024-12-24 08:50:18
original
363 Les gens l'ont consulté

Why Does Go's `==` Operator Fail to Compare `time.Time` Structs Correctly, and How Can `Time.Equal()` and `Time.In()` Methods Resolve This?

Anomalie de comparaison de structures temporelles

Dans Go, l'opérateur == pour la comparaison de structures évalue si tous les champs correspondent. Ce principe s'applique à time.Time, qui comprend un champ de localisation. Par conséquent, lorsque l'on compare deux instances time.Time avec une date et une heure identiques mais des pointeurs d'emplacement potentiellement différents, l'opérateur == renvoie false.

Considérons l'exemple suivant :

import (
    "fmt"
    "time"
)

func main() {
    // Date 2016-04-14, 01:30:30.222 with UTC location
    t1 := time.Date(2016, 4, 14, 1, 30, 30, 222000000, time.UTC)

    // Calculate nanoseconds from 1970-01-01 to t1 and construct t2
    base := time.Date(1970, 1, 1, 0, 0, 0, 0, t1.Location())
    nsFrom1970 := t1.Sub(base).Nanoseconds()
    t2 := time.Unix(0, nsFrom1970)

    // Print comparison results
    fmt.Println("Time t1:", t1)
    fmt.Println("Time t2:", t2)
    fmt.Println("t1 == t2:", t1 == t2)
    fmt.Println("t1.Equal(t2):", t1.Equal(t2))

    // Construct a new time t3 with the same values as t1
    t3 := time.Date(2016, 4, 14, 1, 30, 30, 222000000, time.UTC)
    fmt.Println("t1 == t3:", t1 == t3)
}
Copier après la connexion

Sortie :

Time t1: 2016-04-14 01:30:30.222 +0000 UTC
Time t2: 2016-04-14 01:30:30.222 +0000 UTC
t1 == t2: false
t1.Equal(t2): true
t1 == t3: true
Copier après la connexion

Comme le montre le résultat, t1 == t2 est faux bien que t1.Equal(t2) renvoie vrai. Cet écart provient des différents pointeurs de localisation dans t1 et t2, comme le démontre :

fmt.Println("Locations:", t1.Location(), t2.Location())
fmt.Printf("Location pointers: %p %p", t1.Location(), t2.Location())
Copier après la connexion

Sortie :

Locations: UTC UTC
Location pointers: 0x1e2100 0x1e6de0
Copier après la connexion

Des pointeurs de localisation différents indiquent que ces heures se réfèrent au même instant, mais observé à partir de différents endroits.

Pour garantir la cohérence lors de la comparaison des temps, envisagez d'utiliser la méthode Time.In() pour définir le même emplacement :

t2 = t2.In(t1.Location())
fmt.Println("t1 == t2:", t1 == t2)
Copier après la connexion

Sortie :

t1 == t2: true
Copier après la connexion

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 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