Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Kami Boleh Membezakan Jenis Tersuai daripada Jenis Terbina Dalam Menggunakan Go Reflection?

Bagaimanakah Kami Boleh Membezakan Jenis Tersuai daripada Jenis Terbina Dalam Menggunakan Go Reflection?

Mary-Kate Olsen
Lepaskan: 2025-01-05 03:09:39
asal
819 orang telah melayarinya

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

Mengenal pasti Jenis Bukan Terbina Menggunakan Refleksi

Mengenalpasti Jenis Tersuai

Untuk membezakan antara jenis tersuai dan jenis yang telah ditetapkan, kita boleh menggunakan dua refleksi kaedah:

  • Type.PkgPath(): Mengembalikan laluan pakej jenis bernama. Jenis pratakrif mempunyai laluan pakej kosong.
  • Type.Name(): Mengembalikan nama jenis bernama. Jenis yang tidak dinamakan mengembalikan rentetan kosong.

Jenis tersuai akan mempunyai laluan pakej bukan kosong dan nama bukan kosong. Sebaliknya, jenis yang dipratentukan akan mempunyai laluan pakej kosong.

Mengendalikan Kes Khas

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().

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

Ujian

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

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!

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