Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Kami Boleh Mengenalpasti Jenis Bukan Terbina dalam Go Menggunakan Refleksi Tanpa Penyenaraian Jenis?

Bagaimanakah Kami Boleh Mengenalpasti Jenis Bukan Terbina dalam Go Menggunakan Refleksi Tanpa Penyenaraian Jenis?

Mary-Kate Olsen
Lepaskan: 2024-12-27 13:12:12
asal
579 orang telah melayarinya

How Can We Identify Non-Builtin Types in Go Using Reflection Without Type Listing?

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

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

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!

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