Skip to content

Instantly share code, notes, and snippets.

@legendtkl
Last active August 1, 2016 02:26
Show Gist options
  • Save legendtkl/1efe494dc4830a2800bc4c1276e52ffd to your computer and use it in GitHub Desktop.
Save legendtkl/1efe494dc4830a2800bc4c1276e52ffd to your computer and use it in GitHub Desktop.

Revisions

  1. legendtkl revised this gist Aug 1, 2016. No changes.
  2. legendtkl created this gist Aug 1, 2016.
    35 changes: 35 additions & 0 deletions copyStructFields.go
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,35 @@
    func CopyStruct(src, dst interface{}) {
    sval := reflect.ValueOf(src).Elem()
    dval := reflect.ValueOf(dst).Elem()

    for i := 0; i < sval.NumField(); i++ {
    value := sval.Field(i)
    name := sval.Type().Field(i).Name

    dvalue := dval.FieldByName(name)
    if dvalue.IsValid() == false {
    continue
    }

    typ := sval.Type().Field(i).Type

    switch typ.Kind() {
    case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
    if dvalue.Int() == 0 {
    dvalue.SetInt(value.Int())
    }
    case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
    if dvalue.Uint() == 0 {
    dvalue.SetUint(value.Uint())
    }
    case reflect.Float32, reflect.Float64:
    if dvalue.Float()-0.0 < 0.01 {
    dvalue.SetFloat(value.Float())
    }
    case reflect.String:
    if dvalue.String() == "" {
    dvalue.SetString(value.String())
    }
    }
    }
    }