前言
在某些框架里,为了和实际模型解耦,可能需要用到反射
原写法
var ui UserInfo
json.Unmarshal(buf, &ui)
ui.SyncToDB()
反射写法
// o的类型为interface。在运行时,传递进来的是实例,而不是指针。
t := reflect.TypeOf(o)
if t.Kind() == reflect.Ptr { //指针类型获取真正type需要调用Elem
t = t.Elem()
}
instance := reflect.New(t)
ptr := instance.Interface()
if e := json.Unmarshal(rs, &ptr); e != nil {
fmt.Printf("unmarshal err for key %v buf %s \n", v, rs)
continue
}
m := instance.MethodByName("SyncToDB")
if !m.IsNil() {
m.Call(nil)
continue
}