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