時間構造体比較の異常
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 サイトの他の関連記事を参照してください。