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
Lepaskan: 2024-11-09 07:46:02
asal
1064 orang telah melayarinya

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

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

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

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!

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