/
copy.go
99 lines (82 loc) · 2.25 KB
/
copy.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package gocopy
import (
"github.com/leonardyp/gocopy/logger"
"reflect"
)
var ma, mb = map[string]reflect.Value{}, map[string]reflect.Value{}
func Copy(a, b interface{}) {
defer func() {
if err := recover(); err != nil {
logger.StdDebug("%v", err)
}
}()
rta := reflect.TypeOf(a).Elem()
if rta.Kind() != reflect.Struct {
panic("request struct accept " + rta.Kind().String())
}
rtb := reflect.TypeOf(b).Elem()
if rtb.Kind() != reflect.Struct {
panic("request struct accept " + rta.Kind().String())
}
rva := reflect.ValueOf(a).Elem()
rvb := reflect.ValueOf(b).Elem()
for i := 0; i < rta.NumField(); i++ {
v := rva.Field(i)
switch rva.Field(i).Kind() {
case reflect.String:
ma[rta.Field(i).Name] = rva.Field(i)
case reflect.PtrTo(reflect.TypeOf("")).Kind():
ma[rta.Field(i).Name] = rva.Field(i)
case reflect.Int8, reflect.Int16, reflect.Int, reflect.Int32, reflect.Int64:
ma[rta.Field(i).Name] = rva.Field(i)
case reflect.Uint8, reflect.Uint16, reflect.Uint, reflect.Uint32, reflect.Uint64:
ma[rta.Field(i).Name] = rva.Field(i)
case reflect.Float32, reflect.Float64:
ma[rta.Field(i).Name] = rva.Field(i)
case reflect.Bool:
ma[rta.Field(i).Name] = rva.Field(i)
default:
logger.StdDebug("type v %v not catch", v.Type())
}
}
var nb = map[string]string{}
for i := 0; i < rtb.NumField(); i++ {
if rtb.Field(i).Tag.Get("cp") == "" {
mb[rtb.Field(i).Name] = rvb.Field(i)
} else {
nb[rtb.Field(i).Name] = rtb.Field(i).Tag.Get("cp")
mb[rtb.Field(i).Name] = rvb.Field(i)
}
}
for k, _ := range mb {
old := k
if nameB, ok := nb[k]; ok {
k = nameB
}
if _, ok := ma[k]; ok {
if _, ok = mb[old]; ok {
if ma[k].Kind() == reflect.Ptr {
if ma[k].Elem().Kind() == reflect.String {
mb[old].SetString(ma[k].Elem().String())
}
if ma[k].Elem().Kind() == reflect.Bool {
mb[old].SetBool(ma[k].Elem().Bool())
}
if ma[k].Elem().Kind() == reflect.Int {
mb[old].SetInt(ma[k].Elem().Int())
}
} else {
if ma[k].Kind() == reflect.String {
mb[old].SetString(ma[k].String())
}
if ma[k].Kind() == reflect.Bool {
mb[old].SetBool(true)
}
if ma[k].Kind() == reflect.Int64 {
mb[old].SetInt(ma[k].Int())
}
}
}
}
}
}