Mengenalpasti Jenis Bukan Terbina Dalam Menggunakan Reflect
Cabarannya
Anda perlu membezakan jenis seperti jenis A []bait daripada []bait menggunakan pakej mencerminkan. reflect.TypeOf(A{}).Kind mengembalikan Slice untuk kedua-dua jenis, menjadikannya sukar untuk membezakannya.
Latar Belakang pada Jenis
Pendekatan
Menggunakan kaedah pantulan jenis:
Kes Khas
Pelaksanaan
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 }
Pengujian
Menggunakan ini pada pelbagai jenis:
fmt.Println(isCustom(reflect.TypeOf(""))) // false fmt.Println(isCustom(reflect.TypeOf(int(2)))) // false fmt.Println(isCustom(reflect.TypeOf([]int{}))) // false fmt.Println(isCustom(reflect.TypeOf(struct{ i int }{}))) // false fmt.Println(isCustom(reflect.TypeOf(&i))) // false fmt.Println(isCustom(reflect.TypeOf(map[string]int{}))) // false fmt.Println(isCustom(reflect.TypeOf(A{}))) // true fmt.Println(isCustom(reflect.TypeOf(&A{}))) // true fmt.Println(isCustom(reflect.TypeOf([]A{}))) // true fmt.Println(isCustom(reflect.TypeOf([][]A{}))) // true fmt.Println(isCustom(reflect.TypeOf(struct{ a A }{}))) // true fmt.Println(isCustom(reflect.TypeOf(map[K]int{}))) // true fmt.Println(isCustom(reflect.TypeOf(map[string]K{}))) // true
Ini menunjukkan keupayaan untuk membezakan antara jenis terbina dalam dan tersuai menggunakan pakej mencerminkan dengan berkesan.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Membezakan Antara Jenis Terbina dalam dan Tersuai Menggunakan Pakej `reflect` Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!