ホームページ  >  記事  >  バックエンド開発  >  Go で時間を正確に比較する方法: `==` の代わりに `Equal()` を使用する必要があるのはどのような場合ですか?

Go で時間を正確に比較する方法: `==` の代わりに `Equal()` を使用する必要があるのはどのような場合ですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-25 08:38:02658ブラウズ

How to Compare Times Accurately in Go: When Should You Use `Equal()` Instead of `==`?

Go での時間の比較

Go で時間を比較するときは、タイムゾーンと単調な時計の読み取り値に関連する潜在的なニュアンスを考慮することが重要です。等価演算子 (==) は、時間インスタンスだけでなく、場所と単調時計の読み取り値も比較します。

これを説明するには、次のコードを考えてみましょう。

<code class="go">expect := time.Date(2016, 12, 12, 1, 2, 3, 4, wib)
t1 := time.Date(2016, 12, 12, 1, 2, 3, 4, time.UTC)
res := GenerateWIB(t1)
if res != expect {
    fmt.Printf("WIB Expect %+v, but get %+v", expect, res)
}</code>

このシナリオでは、 res != Expect の比較は、 res と Expect の両方で表される実際の時間が同じであっても、常に true と評価されます。これは、実時間、延長時間、場所、単調時計の読み取り値を表す Time 構造体の内部フィールドがインスタンスごとに異なるためです。

時間を正しく比較するには、次のことをお勧めします。 res.Equal(expect) メソッドを使用すると、内部フィールド間の潜在的な差異が考慮され、より正確な比較が可能になります。 Equal メソッドのドキュメントには次のように記載されています。

「Go == 演算子は時刻だけでなく、位置と単調時計の読み取り値も比較することに注意してください。したがって、時刻の値はマップまたはデータベースのキーとして使用すべきではありません」すべての値に対して同一の Location が設定されていること (UTC または Local メソッドを使用することで実現できます)、および t = t.Round(0) を設定することによって単調クロック読み取り値が削除されていることを最初に保証する必要はありません。」

res.Equal(expect) を使用すると、比較が時刻のみに基づいて行われ、位置や単調な時計の読み取り値の潜在的な違いが無視されます。

以上がGo で時間を正確に比較する方法: `==` の代わりに `Equal()` を使用する必要があるのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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