Bagaimana untuk Mengatasi SetCan() Sentiasa Mengembalikan Palsu Apabila Menetapkan Nilai Medan Struktur Menggunakan Refleksi?

Barbara Streisand
Lepaskan: 2024-10-24 04:19:30
asal
482 orang telah melayarinya

How to Overcome SetCan() Always Returning False When Setting Struct Field Values Using Reflection?

Meneroka Refleksi dengan SetString for Structs

Reflection menyediakan alatan berkuasa untuk memanipulasi struktur Go secara dinamik. Dalam contoh ini, kami menghadapi isu biasa apabila cuba menetapkan nilai medan struct menggunakan refleksi: CanSet() sentiasa mengembalikan palsu. Halangan ini menghalang pengubahsuaian medan, menyebabkan kami berada dalam kebingungan.

Mengenalpasti Perangkap

Coretan kod yang disediakan menyerlahkan dua ralat asas:

  1. Melalukan nilai dan bukannya penuding: Struktur mengikut nilai tidak boleh diubah suai melalui pantulan. Sebaliknya, kita mesti menghantar penunjuk kepada struct, memastikan bahawa sebarang perubahan digunakan pada objek sebenar.
  2. Sasaran elemen yang salah: Kod pada mulanya beroperasi pada keseluruhan struct ProductionInfo dan bukannya pada Entri khusus yang nilai Field1nya perlu diubah. Untuk membetulkan perkara ini, kita perlu menumpukan pada elemen Kemasukan yang dikehendaki.

Menyelesaikan Isu

Selepas menangani masalah ini, kami boleh memperhalusi kod kami:

<code class="go">func SetField(source interface{}, fieldName string, fieldValue string) {
    v := reflect.ValueOf(source).Elem() // Obtain the value of the pointed object
    fmt.Println(v.FieldByName(fieldName).CanSet())
    if v.FieldByName(fieldName).CanSet() {
        v.FieldByName(fieldName).SetString(fieldValue)
    }
}</code>
Salin selepas log masuk

Dalam fungsi SetField() yang diubah suai, kami:

  1. Gunakan Elem() untuk menavigasi ke nilai objek runcing, memastikan kami beroperasi pada struct sebenar.
  2. Gunakan FieldByName() untuk mengakses medan khusus yang ingin kami ubah suai.

Kod dalam Tindakan

Dengan pengubahsuaian ini, kod sekarang berjaya mengemas kini nilai Field1:

<code class="go">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

Output:

Before:  {A 2}
true
After:  {NEW_VALUE 2}
Salin selepas log masuk

Hasilnya mempamerkan kejayaan pengubahsuaian Field1 dalam struct Entry.

Atas ialah kandungan terperinci Bagaimana untuk Mengatasi SetCan() Sentiasa Mengembalikan Palsu Apabila Menetapkan Nilai Medan Struktur Menggunakan Refleksi?. 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!