Untuk membezakan antara jenis tersuai dan jenis yang telah ditetapkan, kita boleh menggunakan dua refleksi kaedah:
Jenis tersuai akan mempunyai laluan pakej bukan kosong dan nama bukan kosong. Sebaliknya, jenis yang dipratentukan akan mempunyai laluan pakej kosong.
Jenis Struktur Tanpa Nama:
Jenis struct tanpa nama tidak dinamakan tetapi mungkin mempunyai bidang jenis tersuai. Kami boleh menyemak jenis tersuai dengan mengulangi medan struct dan menyemak sama ada mana-mana daripadanya tersuai.
Jenis Peta:
Jenis peta boleh mempunyai kunci atau nilai tersuai jenis. Kita boleh menanyakan jenis nilai menggunakan Type.Elem() dan jenis kunci menggunakan Type.Key().
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 }
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
Atas ialah kandungan terperinci Bagaimanakah Kami Boleh Membezakan Jenis Tersuai daripada Jenis Terbina Dalam Menggunakan Go Reflection?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!