Mengapa == mengembalikan palsu untuk struct masa dengan tarikh dan masa yang sama?
In Go, time.Time ialah struct dengan medan mewakili tarikh, masa dan zon masa. Apabila membandingkan dua nilai masa. Masa menggunakan ==, adalah penting untuk ambil perhatian bahawa bukan sahaja tarikh dan masa tetapi juga lokasi dibandingkan.
Pengendali == membandingkan semua medan bukan kosong bagi sesuatu struct, termasuk penunjuk ke medan lokasi (*Lokasi). Walaupun dua lokasi mungkin mewakili zon waktu yang sama, ia mungkin berada di alamat memori yang berbeza.
Akibatnya, apabila membandingkan dua masa. Nilai masa yang berkongsi tarikh dan masa yang sama tetapi dicipta di lokasi yang berbeza, ini menghasilkan == mengembalikan palsu walaupun sesaat masa adalah setara.
Contoh:
Pertimbangkan kod berikut:
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) }
Di sini, t1 dan t2 mewakili detik masa yang sama, tetapi t1 berada dalam UTC manakala t2 berada dalam zon waktu tempatan. Apabila membandingkan t1 dan t2 menggunakan .Equal(), yang mengabaikan lokasi, true dikembalikan. Walau bagaimanapun, menggunakan == menghasilkan palsu kerana penunjuk lokasi yang berbeza.
Penyelesaian:
Untuk membandingkan masa. Nilai masa hanya berdasarkan tarikh dan masa, masa. Kaedah Equal() harus digunakan dan bukannya ==. Sebagai alternatif, anda boleh memastikan secara manual kedua-dua nilai masa. Masa berkongsi penunjuk lokasi yang sama dengan memanggil t.In(t.Location()) padanya.
Atas ialah kandungan terperinci Mengapakah `==` Mengembalikan `palsu` untuk Struktur `masa.Masa` Identical Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!