ホームページ >バックエンド開発 >Golang >Go で「time.Time」構造体と「==」を比較すると「false」が返されることがあるのはなぜですか?

Go で「time.Time」構造体と「==」を比較すると「false」が返されることがあるのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-24 16:02:15522ブラウズ

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

==

を使用した time 構造体の比較の複雑さ 2 つの time を作成するシナリオを考えてみましょう。一見同一の日付と時刻を持つ Time 構造体を作成します。価値観。ただし、等価演算子 (==) を使用してこれらの構造体を比較すると、驚くべきことに、結果は false を返します。この現象は不可解かもしれませんが、その理由は time.Time struct.

の内部実装にあり、Golang の time.Time struct は複合値として定義されています。仕様によれば、構造体の値を == で比較する場合、非 nil フィールドを含むすべてのフィールドが比較可能である必要があります。 Time 構造体は、秒、ナノ秒、そして重要なことに、Location ポインターなどのさまざまなフィールドで構成されます。

Time 構造体の等価性における Location ポインターの役割

これロケーション ポインターは特定のロケーション オブジェクトを指し、タイム ゾーンまたは UTC 時間からのオフセットへの参照として機能します。 == を使用して 2 つの時間構造体を比較する場合、比較は秒とナノ秒だけでなく、それらが保持する Location ポインターにも拡張されます。この問題は、同じ日付と時刻の値を持つ 2 つの時刻構造体が、たとえ同じ場所を表していても、異なる 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() メソッドの使用

2 つの時間構造体が時間値に基づいて等しいとみなされ、そうでないことを確認するにはLocation ポインターにはいくつかのオプションがあります。まず、両方の時刻構造体で UTC() メソッドを呼び出して、位置を UTC に設定します。これにより、それらが同じ Location オブジェクトを共有することが保証され、等価比較に合格します。

または、In() メソッドを使用して、時間構造体の Location を目的の場所に明示的に設定することもできます。両方の時間構造体の In() メソッドへの引数として同じ場所を指定すると、== 演算子を使用するときにそれらの等価性を保証できます。

結論

time.Time 構造体の複雑さ、特に Location ポインターの役割を理解することは、Go で時刻値を正しく比較するために不可欠です。これらの微妙な違いを考慮することで、開発者はコードベースで正確かつ一貫した時間の比較を保証できます。

以上がGo で「time.Time」構造体と「==」を比較すると「false」が返されることがあるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。