Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Mengatasi SetCan() Sentiasa Mengembalikan Palsu Apabila Menetapkan Nilai Medan Struktur Menggunakan Refleksi?

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

Barbara Streisand
Barbara Streisandasal
2024-10-24 04:19:30483semak imbas

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>

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>

Output:

Before:  {A 2}
true
After:  {NEW_VALUE 2}

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!

Kenyataan:
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