Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Mengatasi SetCan() Sentiasa Mengembalikan Palsu Apabila Menetapkan Nilai Medan Struktur Menggunakan Refleksi?
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:
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:
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!