Mengenalpasti Jenis Bukan Binaan Menggunakan Reflect
Soalan:
Membezakan antara jenis seperti []bait dan taip A []bait menggunakan reflect adalah cabaran biasa. Bagaimanakah kita boleh membezakan antara jenis ini tanpa bergantung pada senarai jenis yang ditentukan untuk diperiksa?
Pengenalan:
Latar Belakang pada Jenis:
Memahami klasifikasi jenis dalam Go adalah penting. Terdapat dua kategori utama: jenis bernama dan tidak dinamakan. Jenis bernama diisytiharkan menggunakan kata kunci jenis, manakala jenis yang tidak dinamakan dibuat menggunakan literal jenis. Jenis yang dipraisytiharkan, seperti int dan rentetan, juga tersedia untuk kegunaan segera.
Menggunakan Type.Name() dan Type.PkgPath():
Type.Name () mengembalikan nama jenis bernama, manakala Type.PkgPath() mengembalikan laluan pakej untuk kedua-dua jenis yang dinamakan dan diisytiharkan. Ini membolehkan kami mengasingkan jenis yang tidak dinamakan (Jenis kosong.Nama()) daripada jenis yang dinamakan dan yang dipraisytiharkan.
Kes Khas:
Jenis struct tanpa nama dan jenis peta memerlukan khas pertimbangan. Jenis struct tanpa nama boleh mengandungi medan jenis tersuai, jadi kita mesti menyemak medan secara rekursif menggunakan Type.Elem(). Begitu juga, untuk peta, kita mesti menyemak kedua-dua jenis kunci dan nilai.
Contoh Pelaksanaan:
Berikut ialah contoh kod yang membezakan antara binaan dan bukan binaan jenis:
func isCustom(t reflect.Type) bool { if t.PkgPath() != "" { return true } if k := t.Kind(); k == reflect.Array || k == reflect.Chan || k == reflect.Map || k == reflect.Ptr || k == reflect.Slice { return isCustom(t.Elem()) || k == reflect.Map && isCustom(t.Key()) } else if k == reflect.Struct { for i := t.NumField() - 1; i >= 0; i-- { if isCustom(t.Field(i).Type) { return true } } } return false }
Penggunaan:
Kami boleh menguji fungsi isCustom() dengan pelbagai jenis:
fmt.Println(isCustom(reflect.TypeOf(int(2)))) // false fmt.Println(isCustom(reflect.TypeOf(A{}))) // true fmt.Println(isCustom(reflect.TypeOf(map[K]int{}))) // true
Atas ialah kandungan terperinci Bagaimanakah Kami Boleh Mengenalpasti Jenis Bukan Terbina dalam Go Menggunakan Refleksi Tanpa Penyenaraian Jenis?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!