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>
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>
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
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!