Rumah >pembangunan bahagian belakang >Golang >Mengapa Membandingkan `masa.Masa` Berstruktur dengan `==` Kadang-kadang Kembalikan `salah` dalam Go?

Mengapa Membandingkan `masa.Masa` Berstruktur dengan `==` Kadang-kadang Kembalikan `salah` dalam Go?

Susan Sarandon
Susan Sarandonasal
2024-12-24 16:02:15522semak imbas

Why Does Comparing `time.Time` Structs with `==` Sometimes Return `false` in Go?

Kekeliruan Perbandingan Struktur Masa Menggunakan ==

Pertimbangkan senario di mana anda mencipta dua masa. Struktur masa dengan tarikh dan masa yang kelihatan sama nilai. Walau bagaimanapun, apabila membandingkan struct ini menggunakan pengendali kesamaan (==), secara mengejutkan, hasilnya kembali palsu. Fenomena ini boleh membingungkan, tetapi sebabnya terletak pada pelaksanaan asas masa. Struktur masa.

Di bawah tudung, struct masa. Masa di Golang ditakrifkan sebagai nilai komposit. Mengikut spesifikasi, apabila membandingkan nilai struct dengan ==, semua medannya mestilah setanding, termasuk medan bukan nol. Struktur Masa terdiri daripada pelbagai medan, seperti saat, nanosaat dan, yang penting, penunjuk Lokasi.

Peranan Penunjuk Lokasi dalam Kesamaan Struktur Masa

Ini Penunjuk lokasi menunjuk ke objek lokasi tertentu dan berfungsi sebagai rujukan kepada zon waktu atau mengimbangi dari waktu UTC. Apabila membandingkan dua struct masa menggunakan ==, perbandingan itu bukan sahaja kepada saat dan nanosaat tetapi juga kepada penunjuk Lokasi yang dipegangnya. Masalah timbul apabila dua struct masa dengan nilai tarikh dan masa yang sama merujuk objek Lokasi yang berbeza, walaupun ia mewakili lokasi yang sama. Dalam kes sedemikian, pengendali kesaksamaan melaporkan palsu.

Menyahpepijat Isu Penunjuk Lokasi

Untuk mengesahkan kelakuan ini, pertimbangkan kod berikut:

t1 := time.Date(2016, 4, 14, 1, 30, 30, 222000000, time.UTC)
t2 := time.Unix(0, t1.Sub(time.Date(1970, 1, 1, 0, 0, 0, 0, t1.Location())).Nanoseconds())

fmt.Println("Locations:", t1.Location(), t2.Location())
fmt.Printf("Location pointers: %p %p\n", t1.Location(), t2.Location())
fmt.Println("Locations equal:", t1.Location() == t2.Location())

Output kod ini menunjukkan percanggahan: lokasi adalah sama, tetapi penunjuk Lokasi yang mereka rujuk adalah berbeza, mengakibatkan pengendali kesamaan mengembalikan palsu.

Menyelesaikan Isu: Menggunakan Kaedah UTC atau In()

Untuk memastikan dua struct masa dianggap sama berdasarkan nilai masanya dan bukan penunjuk Lokasi mereka, terdapat beberapa pilihan. Pertama, anda boleh memanggil kaedah UTC() pada kedua-dua struct masa untuk menetapkan Lokasi mereka kepada UTC. Ini memastikan mereka berkongsi objek Lokasi yang sama dan dengan itu melepasi perbandingan kesamaan.

Sebagai alternatif, anda boleh menggunakan kaedah In() untuk menetapkan struct Lokasi masa secara eksplisit ke lokasi yang dikehendaki. Dengan menyediakan lokasi yang sama sebagai hujah kepada kaedah In() untuk kedua-dua struct masa, anda boleh menjamin kesamaan mereka apabila menggunakan operator ==.

Kesimpulan

Memahami selok-belok masa. Struktur masa, terutamanya peranan penunjuk Lokasi, adalah penting untuk membandingkan nilai masa dengan betul dalam Go. Dengan mengambil kira nuansa ini, pembangun boleh memastikan perbandingan masa yang tepat dan konsisten dalam pangkalan kod mereka.

Atas ialah kandungan terperinci Mengapa Membandingkan `masa.Masa` Berstruktur dengan `==` Kadang-kadang Kembalikan `salah` dalam Go?. 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