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
Linda Hamiltonoriginal
2024-12-24 08:50:18295parcourir

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

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

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

Sortie :

Locations: UTC UTC
Location pointers: 0x1e2100 0x1e6de0

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)

Sortie :

t1 == t2: true

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