首頁 >後端開發 >Golang >為什麼 Go 的 == 運算子無法正確比較 time.Time 結構體,以及 Time.Equal() 和 Time.In() 方法如何解決此問題?

為什麼 Go 的 == 運算子無法正確比較 time.Time 結構體,以及 Time.Equal() 和 Time.In() 方法如何解決此問題?

Linda Hamilton
Linda Hamilton原創
2024-12-24 08:50:18298瀏覽

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

時間結構比較異常

在 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn