Rumah > pembangunan bahagian belakang > Golang > Mengapakah `reflect.Value.FieldByName` Panik Apabila Digunakan pada Nilai Penunjuk?

Mengapakah `reflect.Value.FieldByName` Panik Apabila Digunakan pada Nilai Penunjuk?

Barbara Streisand
Lepaskan: 2024-11-03 19:25:03
asal
893 orang telah melayarinya

Why Does `reflect.Value.FieldByName` Panic When Used on a Pointer Value?

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan