Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Kita Boleh Membezakan Antara Jenis Terbina dalam dan Tersuai dalam Go Menggunakan Refleksi?

Bagaimanakah Kita Boleh Membezakan Antara Jenis Terbina dalam dan Tersuai dalam Go Menggunakan Refleksi?

Susan Sarandon
Lepaskan: 2024-12-25 21:11:17
asal
447 orang telah melayarinya

How Can We Distinguish Between Built-in and Custom Types in Go Using Reflection?

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
}
Salin selepas log masuk

Kes Khas:

  • Jenis Struktur Tanpa Nama: Periksa medan struct dan semak jika ada yang mempunyai tersuai taip.
  • Jenis Peta: Periksa kedua-dua jenis kunci dan nilai peta.

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
}
Salin selepas log masuk

Menguji Penyelesaian:

fmt.Println(isCustom(reflect.TypeOf(""))) // false (builtin)
fmt.Println(isCustom(reflect.TypeOf(A{}))) // true (custom)
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan