type RowChangeInfo struct {
ID uint
// Run status
RunStatus *string
ExecutionStartedAt *time.Time
// Worker info
LocustNum *int
}
func TestReflect() {
//s := "r"
now := time.Now()
l := 1
r1 := RowChangeInfo{
ID: 1,
ExecutionStartedAt: &now,
LocustNum: &l,
}
r2 := RowChangeInfo{}
src := reflect.ValueOf(&r1).Elem()
dst := reflect.ValueOf(&r2).Elem()
for i := 0; i < src.NumField(); i++ {
//非指针field call isnil会panic,所以更推荐用下面注释掉的check是否为zero,另外reflect还有个deepequal。
if src.Type().Field(i).Name == "ID" || src.Field(i).IsNil() {
continue
}
dv := dst.FieldByName(src.Type().Field(i).Name)
if dv.IsValid() && dv.CanSet() {
dv.Set(src.Field(i))
}
//if src.Field(i).Interface() == reflect.Zero(src.Field(i).Type()).Interface() {
// fmt.Println("hehe", src.Type().Field(i).Type, src.Type().Field(i).Name)
//} else {
// if dv := dst.Elem().FieldByName(src.Type().Field(i).Name); dv.IsValid() && dv.CanSet() {
// dv.Set(src.Field(i))
// }
//
//}
}
fmt.Println(r2)
}
func main() {
TestReflect()
}
网友评论