为什么 == 对于具有相同日期和时间的时间结构体返回 false?
在 Go 中,time.Time 是一个包含字段的结构体代表日期、时间和时区。使用 == 比较两个 time.Time 值时,需要注意的是,不仅比较日期和时间,还比较位置。
== 运算符比较结构体的所有非空白字段,包括指向位置字段(*Location)的指针。虽然两个位置可能代表相同的时区,但它们可能驻留在不同的内存地址。
因此,在比较共享相同日期和时间但在不同位置创建的两个 time.Time 值时,此即使时刻相等,也会导致 == 返回 false。
示例:
考虑以下内容code:
import ( "fmt" "time" ) func main() { t1 := time.Date(2016, 4, 14, 1, 30, 30, 222000000, time.UTC) t2 := time.Date(2016, 4, 14, 1, 30, 30, 222000000, time.Local) fmt.Println(t1.Equal(t2)) // true (compares date and time only) fmt.Println(t1 == t2) // false (also compares location pointers) }
这里,t1 和 t2 代表同一时刻,但 t1 为 UTC,而 t2 为本地时区。当使用 .Equal() 比较 t1 和 t2 时(忽略位置),返回 true。但是,由于位置指针不同,使用 == 会产生 false。
解决方法:
严格基于日期和时间来比较 time.Time 值。应使用 equal() 方法而不是 ==。或者,您可以通过调用 t.In(t.Location()) 来手动确保两个 time.Time 值共享相同的位置指针。
以上是为什么对于相同的 Go `time.Time` 结构, `==` 返回 `false`?的详细内容。更多信息请关注PHP中文网其他相关文章!