Memanggil `reflect.Value.FieldByName() pada Nilai Penunjuk
Dalam Go, apabila menggunakan refleksi dengan penunjuk struct, cuba memanggil reflect .Value.FieldByName() pada nilai penunjuk struct boleh mengakibatkan ralat berikut:
reflect: call of reflect.Value.FieldByName on ptr Value
Masalah
Ralat ini berlaku apabila anda cuba mengakses medan struct nilai yang diwakili sebagai penunjuk. Pertimbangkan contoh berikut:
type Family struct { first string last string } type Person struct { name string family *Family // Pointer to Family struct } func Check(data interface{}) { v := reflect.ValueOf(data) if v.Kind() == reflect.Struct { v = v.FieldByName("family").FieldByName("last") } }
Apabila menjalankan kod ini, ralat akan berlaku kerana medan keluarga ialah penunjuk.
Penyelesaian
Untuk menyelesaikan masalah ini isu, anda perlu menyahrujuk nilai penuding menggunakan reflect.Indirect() untuk mendapatkan nilai struct sebenar sebelum mengakses medan:
v = reflect.Indirect(v.FieldByName("family")).FieldByName("last")
Dengan pengubahsuaian ini, kod akan mengakses medan terakhir Keluarga dengan betul struct, tidak kira sama ada keluarga ialah nilai atau penunjuk.
Penjelasan
reflect.Indirect() mengembalikan nilai yang ditunjukkan oleh penuding. Jadi, dalam kes ini, ia mengembalikan nilai struktur Keluarga, yang kemudiannya boleh diakses melalui FieldByName().
Atas ialah kandungan terperinci Bagaimana untuk Mengakses Medan dalam Penunjuk Struct menggunakan `reflect.Value.FieldByName()` dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!