Panik daripada Reflect.Value.FieldByName pada Nilai Penunjuk
Kaedah .FieldByName bagi nilai yang dicerminkan boleh menyebabkan panik jika ia dipanggil pada nilai penunjuk. Mesej ralat "panic: reflect: call of reflect.Value.FieldByName pada ptr Value" menunjukkan bahawa nilai yang dihantar ke .FieldByName ialah penunjuk kepada struct, bukannya struct itu sendiri.
Untuk mengelakkan ini panik, adalah penting untuk memastikan bahawa nilai dihantar ke .FieldByName ialah struct sebenar, bukan penunjuk kepadanya. Ini boleh dilakukan dengan menggunakan kaedah Elem() pada pantulan.Nilai yang mewakili penuding untuk menyahrujuknya.
Contoh:
<code class="go">s := reflect.ValueOf(value) if s.Kind() == reflect.Ptr { s = s.Elem() } metric := s.FieldByName(subval.Metric).Interface()</code>
Dalam contoh ini, kaedah Kind() digunakan untuk menyemak sama ada nilai adalah penunjuk. Jika ya, kaedah Elem() digunakan untuk menyahrujuk penuding dan mendapatkan nilai struktur asas. Nilai yang dinyahrujuk ini kemudiannya dihantar ke .FieldByName untuk mendapatkan semula medan dengan nama yang ditentukan.
Atas ialah kandungan terperinci Bagaimana untuk Mengelakkan Panik Apabila Menggunakan `reflect.Value.FieldByName` pada Nilai Penunjuk?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!