시간 구조 비교 이상
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!