Refleksi ialah ciri berkuasa dalam bahasa Go yang membolehkan kami memeriksa dan mengubah suai objek pada masa jalankan. Dengan pantulan, kita boleh: Mengulangi medan objek dan mengubah suai nilai medan secara dinamik. Cipta struktur berdasarkan input dinamik, walaupun kita tidak tahu nama kunci input. Laksanakan penghurai dan penyeri bersiri tersuai tanpa mengubah suai kod sumber. . Dengan refleksi, kita boleh memanipulasi objek secara dinamik tanpa mengubah suai kod sumber. Ini berguna apabila melaksanakan penghurai tersuai, penyeri bersiri dan senario lain di mana tingkah laku perlu dilaraskan secara dinamik berdasarkan input.
Kod
Untuk menunjukkan kuasa pantulan dalam Go, mari buat struct dipanggil dan tukar medannya secara dinamik menggunakan pantulan:
package main import ( "fmt" "reflect" ) type Person struct { Name string Age int } func main() { // 创建一个 Person 结构体的实例 p := Person{"John", 30} // 获取反射类型 rt := reflect.TypeOf(p) // 迭代结构体字段 for i := 0; i < rt.NumField(); i++ { // 获取字段反射值 fv := reflect.ValueOf(p).Field(i) // 修改字段值 switch fv.Kind() { case reflect.String: fv.SetString("Jane") case reflect.Int: fv.SetInt(35) } } // 打印修改后的结构体 fmt.Println(p) }
Kes Praktikal
Secara praktikal, mari kita pertimbangkan secara praktikal. input JSON yang mempunyai nilai kunci yang tidak konsisten. Menggunakan refleksi, kita boleh mencipta struct secara dinamik dengan jenis dan nilai yang betul, walaupun kita tidak tahu apa-apa tentang kekunci input.
Berikut ialah contoh kod untuk melakukan ini: Atas ialah kandungan terperinci Go reflection melaksanakan pengubahsuaian dinamik objek. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!package main
import (
"encoding/json"
"fmt"
"reflect"
)
func main() {
// 输入 JSON 字符串
input := `{"name": "John", "age": 30}`
// 解析 JSON 为 map[string]interface{}
data := make(map[string]interface{})
if err := json.Unmarshal([]byte(input), &data); err != nil {
panic(err)
}
// 创建 Person 反射类型
pType := reflect.TypeOf(Person{})
// 创建 Person 反射值
pValue := reflect.New(pType)
// 迭代 JSON 对象的键值对
for key, val := range data {
// 获取结构体字段的反射值
fv := pValue.Elem().FieldByName(key)
// 检查字段是否存在
if !fv.IsValid() {
continue
}
// 根据字段类型设置字段值
switch fv.Kind() {
case reflect.String:
fv.SetString(val.(string))
case reflect.Int:
fv.SetInt(int64(val.(float64)))
}
}
// 打印修改后的结构体
fmt.Println(pValue.Elem().Interface())
}