美文网首页
Golang reflect机制实现struct 复制/选择复制

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

作者: 听海吹牛逼的声音 | 来源:发表于2019-05-17 04:40 被阅读0次
    
    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 复制/选择复制

          本文链接:https://www.haomeiwen.com/subject/ylmgaqtx.html