首頁 > 後端開發 > Golang > 為什麼在 Go 中比較 `time.Time` 結構體和 `==` 有時會回傳 `false`?

為什麼在 Go 中比較 `time.Time` 結構體和 `==` 有時會回傳 `false`?

Susan Sarandon
發布: 2024-12-24 16:02:15
原創
519 人瀏覽過

Why Does Comparing `time.Time` Structs with `==` Sometimes Return `false` in Go?

使用==

Time 結構比較的困惑考慮一個場景,您創建兩個具有看似相同的日期和時間的time .Time 結構價值觀。然而,當使用相等運算子 (==) 比較這些結構時,令人驚訝的是,結果會傳回 false。這種現象可能令人費解,但原因在於 time.Time 結構體的底層實作。

在底層,Golang 中的 time.Time 結構體被定義為一個複合值。根據規範,當使用 == 比較結構體值時,它們的所有欄位都必須是可比較的,包括非 nil 欄位。 Time 結構由各種欄位組成,例如秒、奈秒,以及重要的位置指標。

位置指針在時間結構相等中的作用

這個位置指針指向特定的位置對象,並用作時區或相對於UTC 時間的偏移量的引用。當使用 == 比較兩個時間結構時,比較不僅擴展到秒和奈秒,還擴展到它們保存的位置指標。當具有相同日期和時間值的兩個時間結構引用不同的 Location 物件時,即使它們代表相同的位置,也會出現問題。在這種情況下,相等運算子會報告 false。

除錯位置指標問題

要驗證此行為,請考慮以下程式碼:

t1 := time.Date(2016, 4, 14, 1, 30, 30, 222000000, time.UTC)
t2 := time.Unix(0, t1.Sub(time.Date(1970, 1, 1, 0, 0, 0, 0, t1.Location())).Nanoseconds())

fmt.Println("Locations:", t1.Location(), t2.Location())
fmt.Printf("Location pointers: %p %p\n", t1.Location(), t2.Location())
fmt.Println("Locations equal:", t1.Location() == t2.Location())
登入後複製

此程式碼的輸出示範了差異:位置相同,但它們引用的位置指標不同,導致相等運算子傳回false。

解決問題:使用UTC 或In() 方法

確保兩個時間結構根據其時間值而不是其位置指針被視為相等,有幾個選項。首先,您可以在兩個時間結構上呼叫 UTC() 方法,將其位置設為 UTC。這確保它們共享相同的 Location 對象,從而透過相等比較。

或者,您可以使用 In() 方法將時間結構的 Location 明確設定為所需位置。透過為兩個時間結構體的 In() 方法提供相同的位置作為參數,您可以在使用 == 運算子時保證它們相等。

結論

了解 time.Time 結構的複雜性,特別是 Location 指針的作用,對於正確比較 Go 中的時間值至關重要。透過考慮這些細微差別,開發人員可以確保其程式碼庫中的時間比較準確且一致。

以上是為什麼在 Go 中比較 `time.Time` 結構體和 `==` 有時會回傳 `false`?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板