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