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

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

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

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

Ausgabe:

Locations: UTC UTC
Location pointers: 0x1e2100 0x1e6de0

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)

Ausgabe:

t1 == t2: true

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!

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