Reflect.Value.FieldByName Panic Explained
Apabila menggunakan kaedah .FieldByName pada nilai yang dicerminkan, anda mungkin menghadapi ralat panik yang serupa dengan :
<code class="go">panic: reflect: call of reflect.Value.FieldByName on ptr Value</code>
Ralat ini biasanya berlaku apabila anda menggunakan reflect.Value secara tidak betul.
Dalam kod contoh yang disediakan:
<code class="go">s := reflect.ValueOf(&value).Elem() metric := s.FieldByName(subval.Metric).Interface()</code>
Punca isu adakah nilai itu sudah menjadi penunjuk kepada struct. Dengan mengambil alamat &nilai, anda membuat penuding ke penuding. Apabila anda kemudian memanggil Elem(), anda membatalkan rujuk penuding kepada penuding, yang tidak perlu.
Untuk menyelesaikan isu ini, hanya gunakan reflect.ValueOf(value).Elem() dan bukannya reflect. ValueOf(&value).Elem(). Ini akan menyahrujuk penuding asal dengan betul, memberikan anda nilai struct sebenar.
Untuk kejelasan, di bawah ialah versi diubah suai kod anda:
<code class="go">s := reflect.ValueOf(value).Elem() metric := s.FieldByName(subval.Metric).Interface() fmt.Println(metric)</code>
Dengan menggunakan reflect.ValueOf(value ).Elem(), anda memperoleh nilai struct sebenar, membolehkan anda mengakses medannya menggunakan s.FieldByName.
Atas ialah kandungan terperinci Mengapakah `reflect.Value.FieldByName` Panik Apabila Digunakan pada Nilai Penunjuk?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!