Mengesan Nilai Kosong dengan Refleksi dalam Go
In Go, apabila berurusan dengan antara muka{} yang memegang nilai pelbagai jenis seperti int, rentetan, bool atau nol, mungkin berguna untuk menentukan sama ada nilai itu tidak dimulakan. Ini selalunya sepadan dengan nilai sifar seperti 0 untuk integer, "" untuk rentetan, false untuk boolean dan nil untuk penunjuk.
Penyelesaian Intuitif
Satu pendekatan untuk ini Masalahnya ialah menggunakan refleksi untuk memeriksa jenis nilai dan membandingkannya dengan nilai sifar yang sepadan untuk itu jenis:
func IsZeroOfUnderlyingType(x interface{}) bool { return x == reflect.Zero(reflect.TypeOf(x)).Interface() }
Mengendalikan Nilai Sifar
Adalah penting untuk membezakan antara nilai antara muka sifar dan nilai antara muka dengan nilai sifar asas. Nilai antara muka sifar tidak mempunyai nilai asas, manakala nilai antara muka dengan nilai sifar asas mempunyai nilai yang sepadan dengan nilai sifar untuk jenis asasnya.
Kemas kini untuk Jenis Tidak Setanding
Penyelesaian asal menggunakan perbandingan kesamarataan (==), yang mungkin tidak berfungsi untuk semua jenis. Sebagai contoh, sesetengah struktur atau jenis mungkin tidak melaksanakan pengendali kesamaan. Untuk memastikan keserasian dengan semua jenis, fungsi DeepEqual daripada pakej reflect boleh digunakan:
func IsZeroOfUnderlyingType(x interface{}) bool { return reflect.DeepEqual(x, reflect.Zero(reflect.TypeOf(x)).Interface()) }
Dengan kemas kini ini, kod harus mengesan nilai kosong dengan tepat untuk sebarang jenis, tanpa mengira kebolehbandingannya.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengesan Nilai Kosong (Termasuk Sifar) dalam Go Menggunakan Refleksi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!