ホームページ > バックエンド開発 > Golang > 同一の Go `time.Time` 構造体に対して `==` が `false` を返すのはなぜですか?

同一の Go `time.Time` 構造体に対して `==` が `false` を返すのはなぜですか?

Mary-Kate Olsen
リリース: 2024-12-17 21:50:16
オリジナル
363 人が閲覧しました

Why Does `==` Return `false` for Identical Go `time.Time` Structs?

同じ日付と時刻を持つ time 構造体に対して == が false を返すのはなぜですか?

Go では、time.Time はフィールドを持つ構造体です。日付、時刻、タイムゾーンを表します。 == を使用して 2 つの time.Time 値を比較する場合、日付と時刻だけでなく場所も比較されることに注意することが重要です。

== 演算子は、構造体の空白以外のフィールドをすべて比較します。場所フィールド (*Location) へのポインター。 2 つの場所が同じタイム ゾーンを表す場合でも、異なるメモリ アドレスに存在する場合があります。

その結果、同じ日付と時刻を共有するが、異なる場所で作成された 2 つの time.Time 値を比較すると、次のようになります。 == は、時刻が同等であっても false を返します。

例:

次のことを考慮してください。コード:

import (
    "fmt"
    "time"
)

func main() {
    t1 := time.Date(2016, 4, 14, 1, 30, 30, 222000000, time.UTC)
    t2 := time.Date(2016, 4, 14, 1, 30, 30, 222000000, time.Local)

    fmt.Println(t1.Equal(t2)) // true (compares date and time only)
    fmt.Println(t1 == t2)      // false (also compares location pointers)
}
ログイン後にコピー

ここで、t1 と t2 は同じ瞬間を表しますが、t1 は UTC であり、t2 はローカル タイムゾーンです。位置を無視する .Equal() を使用して t1 と t2 を比較すると、true が返されます。ただし、== を使用すると、場所ポインターが異なるため false が生成されます。

回避策:

日時、時間に厳密に基づいて time.Time 値を比較します。 == の代わりに Equal() メソッドを使用する必要があります。あるいは、両方の time.Time 値に対して t.In(t.Location()) を呼び出すことで、両方の time.Time 値が同じ位置ポインターを共有することを手動で確認できます。

以上が同一の Go `time.Time` 構造体に対して `==` が `false` を返すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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