Mengenalpasti Jenis Bukan Terbina Menggunakan Refleksi
Masalah:
Membezakan antara jenis seperti [ ]bait dan taip A []bait menggunakan pantulan terbukti mencabar apabila reflect.TypeOf(A{}).Jenis menunjukkan kedua-duanya sebagai kepingan bait. Ia menjadi perlu untuk mencari cara untuk membezakan jenis ini tanpa bergantung pada senarai jenis yang telah ditetapkan.
Latar Belakang:
Jenis dalam Go boleh dikategorikan sebagai dinamakan ( dengan nama jenis) atau tidak dinamakan (menggunakan literal jenis). Jenis yang dipraisytiharkan (seperti rentetan atau int) dinamakan, manakala jenis yang dibuat menggunakan literal jenis (seperti []int atau struct{i int}) tidak dinamakan.
Penyelesaian:
Menggunakan Type.PkgPath():
Type.PkgPath() menyediakan laluan pakej jenis bernama. Untuk jenis yang diisytiharkan atau tidak dinamakan, laluan ini akan kosong. Oleh itu, jenis bukan terbina boleh dikenal pasti dengan menyemak sama ada Type.PkgPath() mengembalikan rentetan bukan kosong.
Mengendalikan Jenis Tanpa Nama Diperoleh daripada Jenis Tersuai:
Menggunakan literal jenis dengan jenis tersuai boleh menghasilkan jenis yang tidak dinamakan (mis., []A). Untuk menentukan sama ada jenis yang tidak dinamakan berasal daripada jenis tersuai, semak jenis elemen menggunakan Type.Elem():
if elem := t.Elem(); elem.Kind() == reflect.Ptr || elem.Kind() == reflect.Struct { // Recursively check elem }
Kes Khas:
Contoh Pelaksanaan:
Kod berikut mentakrifkan fungsi utiliti ialah Custom untuk mengenal pasti bukan terbina jenis:
func isCustom(t reflect.Type) bool { if t.PkgPath() != "" { return true } // Handle special cases and recursion for unnamed types return false }
Menguji Penyelesaian:
fmt.Println(isCustom(reflect.TypeOf(""))) // false (builtin) fmt.Println(isCustom(reflect.TypeOf(A{}))) // true (custom)
Atas ialah kandungan terperinci Bagaimanakah Kita Boleh Membezakan Antara Jenis Terbina dalam dan Tersuai dalam Go Menggunakan Refleksi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!