首页 >后端开发 >Golang >为什么 Go 的 == 运算符无法正确比较 time.Time 结构体,以及 Time.Equal() 和 Time.In() 方法如何解决此问题?

为什么 Go 的 == 运算符无法正确比较 time.Time 结构体,以及 Time.Equal() 和 Time.In() 方法如何解决此问题?

Linda Hamilton
Linda Hamilton原创
2024-12-24 08:50:18300浏览

Why Does Go's `==` Operator Fail to Compare `time.Time` Structs Correctly, and How Can `Time.Equal()` and `Time.In()` Methods Resolve This?

时间结构比较异常

在 Go 中,用于结构比较的 == 运算符会评估所有字段是否匹配。此原则适用于 time.Time,其中包含位置字段。因此,当比较具有相同日期和时间但可能不同位置指针的两个 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) 返回 true,但 t1 == t2 为 false。这种差异源于 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn