Rumah >pembangunan bahagian belakang >Golang >Mengapa Membandingkan Kejadian Masa.Masa Menggunakan == Operator Mengembalikan Palsu Walaupun Ia Mewakili Masa Yang Sama?

Mengapa Membandingkan Kejadian Masa.Masa Menggunakan == Operator Mengembalikan Palsu Walaupun Ia Mewakili Masa Yang Sama?

DDD
DDDasal
2024-10-25 06:52:29318semak imbas

Why Does Comparing Time.Time Instances Using the == Operator Return False Even If They Represent the Same Time?

Pergi perbandingan masa

Anda cuba membandingkan dua kejadian masa, tetapi hasilnya tidak seperti yang anda jangkakan.

Anda mempunyai dua fungsi GenerateWIB dan GenerateUTC untuk menukar zon waktu masa tertentu. GenerateUTC berfungsi dengan sempurna, manakala GenerateWIB tidak.

Kod untuk membandingkan dua masa ialah:

<code class="go">expect := time.Date(2016, 12, 12, 1, 2, 3, 4, wib)
t1 := time.Date(2016, 12, 12, 1, 2, 3, 4, time.UTC)
res := GenerateWIB(t1)
if res != expect {
    fmt.Printf("WIB Expect %+v, but get %+v", expect, res)
}</code>

Hasil perbandingan ini sentiasa palsu, walaupun dua masa itu adalah sama.

Masalahnya ialah anda menggunakan operator == untuk membandingkan dua kejadian masa.Masa. Operator == membandingkan nilai semua medan kedua-dua struct, termasuk medan Lokasi.

Medan Lokasi menentukan zon waktu kejadian masa. Dalam kes anda, expect mempunyai zon waktu wib, manakala res mempunyai zon waktu UTC. Inilah sebabnya mengapa operator == mengembalikan palsu.

Untuk membandingkan dua kejadian masa. Masa dengan betul, anda harus menggunakan kaedah Equal. Kaedah Equal membandingkan nilai dinding dan medan ext kedua-dua struktur, yang mewakili seketika masa. Kaedah Equal mengabaikan medan Lokasi.

Berikut ialah kod yang diperbetulkan:

<code class="go">expect := time.Date(2016, 12, 12, 1, 2, 3, 4, wib)
t1 := time.Date(2016, 12, 12, 1, 2, 3, 4, time.UTC)
res := GenerateWIB(t1)
if !res.Equal(expect) {
    fmt.Printf("WIB Expect %+v, but get %+v", expect, res)
}</code>

Sekarang, hasil perbandingan adalah benar, iaitu hasil yang betul.

Nota

Kaedah Equal adalah lebih tepat daripada operator == apabila membandingkan dua kejadian masa.Masa. Kaedah Equal hanya mengambil kira masa segera, manakala operator == juga mempertimbangkan zon waktu.

Secara umum, anda harus menggunakan kaedah Equal untuk membandingkan dua masa. Contoh masa, melainkan anda mempunyai sebab tertentu untuk gunakan operator ==.

Atas ialah kandungan terperinci Mengapa Membandingkan Kejadian Masa.Masa Menggunakan == Operator Mengembalikan Palsu Walaupun Ia Mewakili Masa Yang Sama?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn