Kenal pasti Jenis Bukan Terbina Menggunakan Reflect
Dalam Go, sukar untuk membezakan jenis yang ditentukan pengguna daripada jenis terbina dalam menggunakan hanya pakej mencerminkan. Tugas ini penting untuk aplikasi yang mengendalikan data jenis yang tidak diketahui. Mari kita terokai cara untuk mencapai perbezaan ini dengan berkesan.
Jenis Pra-diisytiharkan dan Tidak Dinamakan
Langkah pertama ialah memahami perbezaan antara jenis yang diisytiharkan dan tidak dinamakan. Jenis yang diisytiharkan adalah yang ditakrifkan dalam spesifikasi bahasa (cth., int, rentetan). Jenis yang tidak dinamakan, sebaliknya, dicipta menggunakan literal jenis (cth., []int).
Menggunakan Type.PkgPath()
The Type.PkgPath( ) kaedah mengembalikan laluan pakej untuk jenis yang diberikan. Laluan ini akan kosong untuk jenis yang diisytiharkan atau tidak dinamakan. Walau bagaimanapun, jika anda mempunyai jenis yang ditentukan pengguna, ia akan mempunyai laluan pakej yang tidak kosong.
fmt.Printf("%q\n", reflect.TypeOf(int(1)).PkgPath()) // "" (Predeclared) fmt.Printf("%q\n", reflect.TypeOf(A{}).PkgPath()) // "main" (User-defined)
Mengendalikan Kes Khas
Terdapat beberapa istimewa kes untuk dipertimbangkan:
Contoh Pelaksanaan
Berikut ialah contoh fungsi yang menentukan sama ada sesuatu jenis itu bukan terbina dalam:
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 }
Kesimpulan
Dengan menggabungkan Type.PkgPath() dengan pengendalian berhati-hati kes khas, anda boleh mengenal pasti bukan terbina dengan berkesan dalam jenis menggunakan pakej mencerminkan. Teknik ini amat berguna untuk aplikasi yang perlu berinteraksi secara dinamik dengan data jenis yang tidak diketahui.
Atas ialah kandungan terperinci Bagaimana Mengenalpasti Jenis Bukan Terbina dengan Berkesan Menggunakan Pakej Reflect Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!