时间结构比较异常
在 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中文网其他相关文章!