> 백엔드 개발 > Golang > Go의 `==` 연산자가 `time.Time` 구조체를 올바르게 비교하지 못하는 이유는 무엇이며, `Time.Equal()` 및 `Time.In()` 메서드는 이 문제를 어떻게 해결할 수 있습니까?

Go의 `==` 연산자가 `time.Time` 구조체를 올바르게 비교하지 못하는 이유는 무엇이며, `Time.Equal()` 및 `Time.In()` 메서드는 이 문제를 어떻게 해결할 수 있습니까?

Linda Hamilton
풀어 주다: 2024-12-24 08:50:18
원래의
305명이 탐색했습니다.

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

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿