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!