-
Notifications
You must be signed in to change notification settings - Fork 1
/
merge_config.go
47 lines (43 loc) · 1.03 KB
/
merge_config.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
package utils
import "reflect"
// MergeStructs 合并相同的类型的结构体指针对象
// 经过反射,性能较低,不建议用于用户级业务处理
// @skip
func MergeStructs[T any](src T, ts ...T) error {
if len(ts) > 0 {
for i := range ts {
var err error
err = MergeStruct[T](src, ts[i])
if err != nil {
return err
}
}
}
return nil
}
// MergeStruct 合并相同的类型的结构体指针对象
// 经过反射,性能较低,不建议用于用户级业务处理
// @skip
func MergeStruct[T any](src T, t T) error {
srcVal := reflect.ValueOf(src).Elem()
targetVal := reflect.ValueOf(t).Elem()
mergeValue(srcVal, targetVal)
return nil
}
// 值合并,反射
func mergeValue(src reflect.Value, t reflect.Value) {
kind := src.Kind()
if kind == reflect.Interface {
// TODO 接口类型处理
} else if kind == reflect.Struct {
for i := 0; i < src.NumField(); i++ {
srcField := src.Field(i)
tField := t.Field(i)
mergeValue(srcField, tField)
}
} else {
if !t.IsZero() {
src.Set(t)
}
}
}