Heim > Backend-Entwicklung > Golang > Warum gibt der Vergleich von „time.Time'-Strukturen mit „==' in Go manchmal „false' zurück?

Warum gibt der Vergleich von „time.Time'-Strukturen mit „==' in Go manchmal „false' zurück?

Susan Sarandon
Freigeben: 2024-12-24 16:02:15
Original
519 Leute haben es durchsucht

Why Does Comparing `time.Time` Structs with `==` Sometimes Return `false` in Go?

Die Verwirrung des Zeitstrukturvergleichs mit ==

Stellen Sie sich ein Szenario vor, in dem Sie zwei Zeitstrukturen mit scheinbar identischem Datum und identischer Uhrzeit erstellen Werte. Wenn man diese Strukturen jedoch mit dem Gleichheitsoperator (==) vergleicht, gibt das Ergebnis überraschenderweise „false“ zurück. Dieses Phänomen kann rätselhaft sein, aber der Grund liegt in der zugrunde liegenden Implementierung der time.Time-Struktur.

Unter der Haube ist die time.Time-Struktur in Golang als zusammengesetzter Wert definiert. Gemäß der Spezifikation müssen beim Vergleich von Strukturwerten mit == alle ihre Felder vergleichbar sein, auch Nicht-Null-Felder. Die Zeitstruktur besteht aus verschiedenen Feldern wie Sekunden, Nanosekunden und, was wichtig ist, einem Ortszeiger.

Die Rolle von Ortszeigern bei der Zeitstrukturgleichheit

Dies Der Standortzeiger zeigt auf ein bestimmtes Standortobjekt und dient als Referenz auf die Zeitzone oder den Offset zur UTC-Zeit. Beim Vergleich zweier Zeitstrukturen mit == erstreckt sich der Vergleich nicht nur auf die Sekunden und Nanosekunden, sondern auch auf die darin enthaltenen Standortzeiger. Das Problem entsteht, wenn zwei Zeitstrukturen mit identischen Datums- und Uhrzeitwerten auf unterschiedliche Standortobjekte verweisen, auch wenn sie denselben Standort darstellen. In solchen Fällen meldet der Gleichheitsoperator „falsch“.

Debuggen des Standortzeigerproblems

Um dieses Verhalten zu überprüfen, berücksichtigen Sie den folgenden Code:

t1 := time.Date(2016, 4, 14, 1, 30, 30, 222000000, time.UTC)
t2 := time.Unix(0, t1.Sub(time.Date(1970, 1, 1, 0, 0, 0, 0, t1.Location())).Nanoseconds())

fmt.Println("Locations:", t1.Location(), t2.Location())
fmt.Printf("Location pointers: %p %p\n", t1.Location(), t2.Location())
fmt.Println("Locations equal:", t1.Location() == t2.Location())
Nach dem Login kopieren

Die Ausgabe dieses Codes zeigt die Diskrepanz: Die Standorte sind gleich, aber die Standortzeiger, auf die sie verweisen, sind unterschiedlich, was dazu führt, dass der Gleichheitsoperator zurückkehrt falsch.

Behebung des Problems: Verwendung der UTC- oder In()-Methode

Um sicherzustellen, dass zwei Zeitstrukturen basierend auf ihren Zeitwerten und nicht auf ihren Standortzeigern als gleich betrachtet werden , es gibt ein paar Möglichkeiten. Erstens können Sie die UTC()-Methode für beide Zeitstrukturen aufrufen, um deren Standort auf UTC festzulegen. Dadurch wird sichergestellt, dass sie dasselbe Standortobjekt verwenden und somit den Gleichheitsvergleich bestehen.

Alternativ können Sie die In()-Methode verwenden, um den Standort der Zeitstrukturen explizit auf den gewünschten Standort festzulegen. Indem Sie für beide Zeitstrukturen den gleichen Ort als Argument für die In()-Methode bereitstellen, können Sie deren Gleichheit bei Verwendung des ==-Operators garantieren.

Fazit

Für den korrekten Vergleich von Zeitwerten in Go ist es wichtig, die Feinheiten der time.Time-Struktur zu verstehen, insbesondere die Rolle des Standortzeigers. Durch die Berücksichtigung dieser Nuancen können Entwickler genaue und konsistente Zeitvergleiche in ihrer Codebasis sicherstellen.

Das obige ist der detaillierte Inhalt vonWarum gibt der Vergleich von „time.Time'-Strukturen mit „==' in Go manchmal „false' zurück?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage