Golang reflect机制实现struct 复制/选择复制

听海吹牛逼的声音 · · 2209 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。


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()

}

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:听海吹牛逼的声音

查看原文:Golang reflect机制实现struct 复制/选择复制

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2209 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传