ホームページ > バックエンド開発 > Golang > Go の `==` 演算子が `time.Time` 構造体を正しく比較できないのはなぜですか? `Time.Equal()` メソッドと `Time.In()` メソッドはどのようにしてこれを解決できるのでしょうか?

Go の `==` 演算子が `time.Time` 構造体を正しく比較できないのはなぜですか? `Time.Equal()` メソッドと `Time.In()` メソッドはどのようにしてこれを解決できるのでしょうか?

Linda Hamilton
リリース: 2024-12-24 08:50:18
オリジナル
305 人が閲覧しました

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 に適用されます。したがって、日付と時刻は同じだが、場所ポインターが異なる可能性がある 2 つの 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) にもかかわらず、t1 == t2 は false です。 trueを返します。この不一致は、次の例で示すように、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 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート