Heim > Backend-Entwicklung > Golang > Warum kann der „=='-Operator von Go die „time.Time'-Strukturen nicht korrekt vergleichen und wie können die Methoden „Time.Equal()' und „Time.In()' dieses Problem beheben?

Warum kann der „=='-Operator von Go die „time.Time'-Strukturen nicht korrekt vergleichen und wie können die Methoden „Time.Equal()' und „Time.In()' dieses Problem beheben?

Linda Hamilton
Freigeben: 2024-12-24 08:50:18
Original
291 Leute haben es durchsucht

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

Anomalie beim Zeitstrukturvergleich

In Go wertet der Operator == für den Strukturvergleich aus, ob alle Felder übereinstimmen. Dieses Prinzip gilt für time.Time, das ein Standortfeld enthält. Folglich liefert der ==-Operator beim Vergleich zweier time.Time-Instanzen mit identischem Datum und identischer Uhrzeit, aber möglicherweise unterschiedlichen Standortzeigern „false“.

Betrachten Sie das folgende Beispiel:

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)
}
Nach dem Login kopieren

Ausgabe:

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
Nach dem Login kopieren

Wie aus der Ausgabe hervorgeht, ist t1 == t2 falsch, obwohl t1.Equal(t2) true zurückgibt. Diese Diskrepanz ist auf die unterschiedlichen Ortszeiger in t1 und t2 zurückzuführen, wie gezeigt durch:

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

Ausgabe:

Locations: UTC UTC
Location pointers: 0x1e2100 0x1e6de0
Nach dem Login kopieren

Unterschiedliche Ortszeiger zeigen an, dass sich diese Zeiten auf denselben Zeitpunkt beziehen. aber von verschiedenen Standorten aus beobachtet.

Um beim Vergleichen der Zeiten Konsistenz zu gewährleisten, sollten Sie die Verwendung der Time.In()-Methode in Betracht ziehen, um dieselben festzulegen Ort:

t2 = t2.In(t1.Location())
fmt.Println("t1 == t2:", t1 == t2)
Nach dem Login kopieren

Ausgabe:

t1 == t2: true
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWarum kann der „=='-Operator von Go die „time.Time'-Strukturen nicht korrekt vergleichen und wie können die Methoden „Time.Equal()' und „Time.In()' dieses Problem beheben?. 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