ホームページ  >  記事  >  バックエンド開発  >  Go で「==」を使用して時間値を比較すると予期しない結果が生じるのはなぜですか?

Go で「==」を使用して時間値を比較すると予期しない結果が生じるのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-25 05:10:02833ブラウズ

Why Does Comparing Time Values in Go With `==` Lead to Unexpected Results?

Go の時間比較: タイム ゾーンの違いをナビゲートする

Go では、タイム ゾーンの変換の処理が複雑になる場合があります。時刻の値を等価演算子 (==) で比較すると予期しない結果が生じる状況を調べてみましょう。

問題:

開発者が時刻を UTC から UTC に変換しようとしました。 GenerateWIB と GenerateUTC の 2 つの関数を使用した 0700 WIB。 GenerateUTC は意図したとおりに機能しますが、GenerateWIB は異なる結果を生成します。調査すると、両方の時間が同一であるように見えるため、混乱が生じます。

解決策:

問題は、時間値を比較するために使用される方法にあります。 Go の等価演算子 (==) は、時刻だけでなく、時刻値の位置と単調時計の読み取り値も考慮します。これにより、異なる場所や時計の読み取り値と時刻値を比較するときに、予期しない結果が生じる可能性があります。

時刻値を正しく比較するには、.Equal() メソッドを使用することをお勧めします。 .Equal() は、位置と時計の読み取り値の違いを無視する、より正確な比較を使用します。

技術的な説明:

Go の時間値は、time.Time 構造体によって表されます。これには、wall、ext、loc の 3 つのプライベート フィールドが含まれます。これらのフィールドは、壁時計のタイムスタンプとしての時刻、オプションの単調時計読み取り値、および場所をそれぞれ表します。 == を使用して時間値を比較する場合、これらのフィールドの値が比較されます。ただし、.Equal() は、位置や時計の読み取り値の違いを無視して、値で表される時刻を比較します。

提供された例では、GenerateWIB() は時刻を 0700 WIB に変換しますが、t1 は UTC のままです。 。これにより、loc フィールドは異なるが時刻は同じ 2 つの time.Time 値が生成されます。 == を使用してそれらを比較すると、loc フィールドが異なるため比較が失敗します。ただし、.Equal() は、時刻が同じであることを正しく識別します。

結論:

Go で時間値を比較する場合、 == の代わりに .Equal() メソッドを使用して、位置と時計の読み取り値の違いを考慮した正確かつ正確な比較を保証します。

以上がGo で「==」を使用して時間値を比較すると予期しない結果が生じるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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