時間結構比較異常
在 Go 中,用於結構比較的 == 運算子會評估所有欄位是否符合。此原則適用於 time.Time,其中包含位置欄位。因此,當比較具有相同日期和時間但可能不同位置指標的兩個 time.Time 實例時,== 運算子會產生 false。
考慮以下範例:
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) }
輸出:
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
從輸出中可以明顯看出,儘管t1.Equal(t2) 傳回true,但t1 == t2 為false。這種差異源於t1 和t2 中不同的位置指針,如下所示:
fmt.Println("Locations:", t1.Location(), t2.Location()) fmt.Printf("Location pointers: %p %p", t1.Location(), t2.Location())
輸出:
Locations: UTC UTC Location pointers: 0x1e2100 0x1e6de0
不同的位置指針表明這些時間指的是同一時刻,但從不同位置觀察。
為了確保比較時間時的一致性,請考慮使用 Time.In() 方法來設定相同位置:
t2 = t2.In(t1.Location()) fmt.Println("t1 == t2:", t1 == t2)
輸出:
t1 == t2: true
以上是為什麼 Go 的 == 運算子無法正確比較 time.Time 結構體,以及 Time.Equal() 和 Time.In() 方法如何解決此問題?的詳細內容。更多資訊請關注PHP中文網其他相關文章!