Bagaimana Menggunakan Refleksi untuk Mengubah Medan Struct dengan CanSet() dan Structs?

Barbara Streisand
Lepaskan: 2024-10-24 19:02:29
asal
838 orang telah melayarinya

How to Use Reflection to Modify Struct Fields with CanSet() and Structs?

Menggunakan Refleksi untuk Mengubah Suai Medan Struct: CanSet() dan Structs

Apabila menggunakan refleksi untuk mengubah suai medan struct, adalah penting untuk memahami prinsip di sebalik kebolehcapaian dan pengubahsuaian medan.

CanSet() untuk Structs

Dalam contoh anda, anda menemui CanSet() mengembalikan false untuk medan struct. Ini kerana secara lalai, Go tidak membenarkan mengubah suai medan tidak dieksport (peribadi) sesuatu struct menggunakan pantulan. Ini ialah langkah keselamatan untuk mengelakkan pengubahsuaian tidak sengaja atau berniat jahat bagi keadaan struct dalaman.

Mengatasi Isu

Untuk menetapkan nilai medan struct menggunakan refleksi, pertimbangkan perkara berikut langkah:

  1. Ubah Suai Nilai: Apabila memanggil fungsi SetField() anda, hantarkan penuding kepada struct, bukan nilai struct itu sendiri. Ini membolehkan anda mengubah suai struct sebenar, bukan salinan.
  2. Gunakan Value.Elem() untuk Penunjuk: Jika anda menghantar penunjuk kepada struct, anda perlu menggunakan reflect.ValueOf (sumber).Elem() untuk mendapatkan pantulan.Nilai struct runcing. Ini menavigasi ke nilai struct sebenar.
  3. Gunakan FieldByName untuk Field Access: Daripada menggelung melalui semua medan dalam struct, gunakan v.FieldByName(fieldName) untuk mengakses medan khusus yang anda mahu untuk mengubah suai. Ini memastikan anda mengakses medan yang betul dan lebih cekap.

Kod Diubah Suai

Berikut ialah kod diubah suai yang menangani isu:

<code class="go">func SetField(source interface{}, fieldName string, fieldValue string) {
    v := reflect.ValueOf(source).Elem()
    fmt.Println(v.FieldByName(fieldName).CanSet())

    if v.FieldByName(fieldName).CanSet() {
        v.FieldByName(fieldName).SetString(fieldValue)
    }
}

func main() {
    source := ProductionInfo{}
    source.StructA = append(source.StructA, Entry{Field1: "A", Field2: 2})

    fmt.Println("Before: ", source.StructA[0])
    SetField(&source.StructA[0], "Field1", "NEW_VALUE")
    fmt.Println("After: ", source.StructA[0])
}</code>
Salin selepas log masuk

Kod ini kini akan berjaya mengubah suai nilai Field1 struct Entry.

Atas ialah kandungan terperinci Bagaimana Menggunakan Refleksi untuk Mengubah Medan Struct dengan CanSet() dan Structs?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php
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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!