Maison >développement back-end >Golang >Pourquoi `==` renvoie-t-il `false` pour des structures Go `time.Time` identiques ?

Pourquoi `==` renvoie-t-il `false` pour des structures Go `time.Time` identiques ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-17 21:50:16277parcourir

Why Does `==` Return `false` for Identical Go `time.Time` Structs?

Pourquoi == renvoie-t-il false pour les structures temporelles avec des dates et des heures identiques ?

Dans Go, time.Time est une structure avec des champs représentant la date, l'heure et le fuseau horaire. Lorsque vous comparez deux valeurs time.Time à l'aide de ==, il est important de noter que non seulement la date et l'heure, mais également le lieu sont comparés.

L'opérateur == compare tous les champs non vides d'une structure, y compris le pointeur vers le champ de localisation (*Location). Bien que deux emplacements puissent représenter le même fuseau horaire, ils peuvent résider à des adresses mémoire différentes.

Par conséquent, lorsque l'on compare deux valeurs time.Time qui partagent la même date et la même heure mais ont été créées à des emplacements différents, cela entraîne == renvoie false même si les instants sont équivalents.

Exemple :

Considérez ce qui suit code :

import (
    "fmt"
    "time"
)

func main() {
    t1 := time.Date(2016, 4, 14, 1, 30, 30, 222000000, time.UTC)
    t2 := time.Date(2016, 4, 14, 1, 30, 30, 222000000, time.Local)

    fmt.Println(t1.Equal(t2)) // true (compares date and time only)
    fmt.Println(t1 == t2)      // false (also compares location pointers)
}

Ici, t1 et t2 représentent le même moment dans le temps, mais t1 est en UTC tandis que t2 est dans le fuseau horaire local. Lors de la comparaison de t1 et t2 à l'aide de .Equal(), qui ignore l'emplacement, true est renvoyé. Cependant, l'utilisation de == produit faux en raison des différents pointeurs d'emplacement.

Solution de contournement :

Pour comparer l'heure. Les valeurs d'heure sont strictement basées sur la date et l'heure, l'heure. La méthode Equal() doit être utilisée à la place de ==. Alternativement, vous pouvez vous assurer manuellement que les deux valeurs time.Time partagent le même pointeur d'emplacement en appelant t.In(t.Location()) dessus.

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