Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Mengakses Medan dalam Penunjuk Struct menggunakan `reflect.Value.FieldByName()` dalam Go?

Bagaimana untuk Mengakses Medan dalam Penunjuk Struct menggunakan `reflect.Value.FieldByName()` dalam Go?

Mary-Kate Olsen
Lepaskan: 2024-11-08 11:49:02
asal
237 orang telah melayarinya

How to Access Fields in a Struct Pointer using `reflect.Value.FieldByName()` in Go?

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

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

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

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!

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