Bagaimanakah saya boleh menggunakan refleksi untuk mendapatkan alamat medan bukan penuding dalam struktur bersarang dalam Go?

Barbara Streisand
Lepaskan: 2024-10-31 11:06:02
asal
555 orang telah melayarinya

How can I use reflection to obtain the address of a non-pointer field within a nested structure in Go?

Dapatkan Penunjuk kepada Nilai Menggunakan Refleksi

Refleksi menyediakan mekanisme yang berkuasa untuk memeriksa struktur dan tingkah laku objek dalam Go. Ini boleh digunakan untuk merentasi dan menganalisis medan antara muka, tanpa mengira jenis asasnya. Satu tugas biasa dalam senario sedemikian ialah mendapatkan semula alamat medan bukan penuding.

Untuk menunjukkan perkara ini, pertimbangkan kod berikut:

<code class="go">type Z struct {
    Id int
}

type V struct {
    Id int
    F Z
}

type T struct {
    Id int
    F V
}</code>
Salin selepas log masuk

Kami mentakrifkan fungsi InspectStruct untuk lelaran melalui medan antara muka dan memaparkan butirannya, termasuk nilai dan alamatnya. Fungsi ini menggunakan pantulan untuk menavigasi struktur antara muka yang diluluskan.

Walau bagaimanapun, pelaksanaan asal menghadapi cabaran dalam mendapatkan alamat medan bukan penunjuk pada kedalaman yang lebih besar daripada antara muka peringkat atas. Isu ini diatasi dengan mengubah suai fungsi untuk menerima pantulan.Nilai terus dan bukannya nilai antara muka (antara muka{}).

<code class="go">func InspectStructV(val reflect.Value) {
    ...
}

func InspectStruct(v interface{}) {
    InspectStructV(reflect.ValueOf(v))
}</code>
Salin selepas log masuk

Perubahan ini membolehkan kami bekerja dengan nilai pantulan sebenar, membolehkan kami memperoleh alamat yang tepat untuk medan bukan penunjuk tanpa mengira kedalaman mereka dalam struktur. Output InspectStruct yang dikemas kini kini menunjukkan alamat yang betul untuk semua medan dalam struktur yang disediakan:

Field Name: Id,  Field Value: 1,     Address: 0x12345678 , Field type: int   , Field kind: int
Field Name: F,   Field Value: {2 {3}},   Address: 0x12345679 , Field type: main.V    , Field kind: struct
Field Name: Id,  Field Value: 2,     Address: 0x1234567a , Field type: int   , Field kind: int
Field Name: F,   Field Value: {3},   Address: 0x1234567b , Field type: main.Z    , Field kind: struct
Field Name: Id,  Field Value: 3,     Address: 0x1234567c , Field type: int   , Field kind: int
Salin selepas log masuk

Dengan menggunakan reflect.Value secara langsung, fungsi InspectStruct kini boleh berjaya mendapatkan alamat semua medan, walaupun yang bersarang dalam antara muka awal.

Atas ialah kandungan terperinci Bagaimanakah saya boleh menggunakan refleksi untuk mendapatkan alamat medan bukan penuding dalam struktur bersarang 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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!