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