Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Mendapatkan Nilai Medan Penunjuk Menggunakan Refleksi dalam Go?

Bagaimana untuk Mendapatkan Nilai Medan Penunjuk Menggunakan Refleksi dalam Go?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-09 07:46:021076semak imbas

How to Retrieve Field Values of Pointers Using Reflection in Go?

Mendapatkan Nilai Medan Penunjuk Menggunakan Refleksi

Dalam artikel ini, kami akan meneroka isu yang dihadapi semasa cuba mendapatkan semula nilai medan struct yang mengandungi penuding kepada satu lagi struct.

Pertimbangkan contoh ini:

type Family struct {
   first string
   last string
}

type Person struct {
   name string
   family *Family
}

Bayangkan kita mempunyai Orang dengan penunjuk kepada Keluarga. Kami mahu mengakses medan terakhir Keluarga menggunakan refleksi. Kod berikut akan gagal dengan ralat:

func Check(data interface{}) {
    var v = reflect.ValueOf(data)

    if v.Kind() == reflect.Struct {
        fmt.Println("was a struct")
        v = v.FieldByName("family").FieldByName("last")
        fmt.Println(v)
    }
}

Ralat yang dihadapi ialah:

reflect: call of reflect.Value.FieldByName pada ptr Value

Sebab untuk ralat ini ialah kita cuba memanggil .FieldByName("family") pada reflect.Nilai yang mewakili penunjuk, bukannya nilai yang ditunjukkannya.

Untuk menyelesaikan isu ini, kita perlu tidak langsung terlebih dahulu nilai penunjuk sebelum memanggil .FieldByName(). Kod yang diperbetulkan akan kelihatan seperti ini:

func Check(data interface{}) {
    var v = reflect.ValueOf(data)

    if v.Kind() == reflect.Struct {
        fmt.Println("was a struct")
        familyPtr := v.FieldByName("family")
        v = reflect.Indirect(familyPtr).FieldByName("last")
        fmt.Println(v)
    }
}

Dengan membatalkan rujukan secara tidak langsung nilai penuding menggunakan reflect.Indirect(), kita boleh mengakses nilai asas dan kemudian mendapatkan semula medan terakhir menggunakan .FieldByName().

Atas ialah kandungan terperinci Bagaimana untuk Mendapatkan Nilai Medan Penunjuk Menggunakan Refleksi dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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