-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvalueMeta.go
163 lines (150 loc) · 4.41 KB
/
valueMeta.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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
package mapper
import (
"reflect"
"strings"
"github.com/farseer-go/fs/fastReflect"
)
// 元数据
type valueMeta struct {
fastReflect.PointerMeta // 类型
//Id uint64 // 唯一ID
Parent *valueMeta // 上级元数据
FullName string // 字段名称(由ParentName + 当前名称)
FieldName string // 字段名称(StructField)
ReflectValue reflect.Value // 值
IsNil bool // 是否为nil
IsAnonymous bool // 是否为内嵌类型
IsIgnore bool // 是否为忽略字段
Level int // 当前解析的层数(默认为第0层)
}
// newMeta 得到类型的元数据
//
// func newMetaVal(fromVal reflect.Value) valueMeta {
// return valueMeta{
// //Id: 1,
// ReflectValue: fromVal,
// IsNil: false,
// PointerMeta: fastReflect.PointerOfValue(fromVal),
// }
// }
//
// newMeta 得到类型的元数据
func newMetaVal(value reflect.Value) *valueMeta {
meta := &valueMeta{
IsNil: true,
}
meta.setReflectValue(value)
meta.PointerMeta = fastReflect.PointerOfValue(meta.ReflectValue)
return meta
}
// newStructField 创建子元数据
func newStructField(reflectValue reflect.Value, field reflect.StructField, parent *valueMeta) *valueMeta {
mt := &valueMeta{
// Id: parent.Id*10 + uint64(field.Index[0]),
Parent: parent,
Level: parent.Level + 1,
IsAnonymous: field.Anonymous,
FieldName: field.Name,
}
// 4ms
mt.setReflectValue(reflectValue)
// 4ms
mt.PointerMeta = fastReflect.PointerOfValue(mt.ReflectValue)
//return valueMeta{}
// 定义的标签
//tags := strings.Split(field.Tag.Get("mapper"), ";")
//for _, tag := range tags {
// if tag == "ignore" {
// mt.IsIgnore = true
// break
// }
//}
// 1ms
switch parent.Type {
case fastReflect.Slice:
if len(field.Name) > 0 {
var strBuilder strings.Builder
strBuilder.WriteString(parent.FullName)
strBuilder.WriteString("[")
strBuilder.WriteString(field.Name)
strBuilder.WriteString("]")
mt.FullName = strBuilder.String()
} else {
mt.FullName = parent.FullName
}
case fastReflect.Map, fastReflect.Dic:
if len(field.Name) > 0 {
mt.FullName = parent.FullName + field.Name
} else {
mt.FullName = parent.FullName
}
default:
// 内嵌字段类型的Name为类型名称,这里用标记代替
if mt.IsAnonymous {
mt.FullName = parent.FullName
} else {
mt.FullName = parent.FullName + field.Name
}
}
return mt
}
func (receiver *valueMeta) setReflectValue(reflectValue reflect.Value) {
kind := reflectValue.Kind()
if kind == reflect.Pointer {
if receiver.IsNil = reflectValue.IsNil(); !receiver.IsNil {
reflectValue = reflectValue.Elem()
receiver.setReflectValue(reflectValue)
return
}
}
switch kind {
case reflect.Pointer:
if !receiver.IsNil {
receiver.IsNil = reflectValue.IsNil()
}
case reflect.Chan, reflect.Func, reflect.Map, reflect.Slice:
receiver.IsNil = reflectValue.IsNil()
case reflect.Interface:
receiver.IsNil = reflectValue.IsNil()
// 取真实的类型
if !receiver.IsNil {
reflectValue = reflectValue.Elem()
receiver.setReflectValue(reflectValue)
return
}
default:
receiver.IsNil = false
}
receiver.ReflectValue = reflectValue
}
// NewReflectValue 左值为指针类型时,需要先初始化
func (receiver *valueMeta) NewReflectValue() {
if !receiver.ReflectValue.IsValid() {
receiver.setReflectValue(receiver.ZeroReflectValueElem)
return
}
//if types.IsNil(receiver.ReflectValue) {
if receiver.IsNil {
// 不能使用此缓存的对象,会出现目标结构有同样结构体类型时,出现同样的指针地址
switch receiver.Type {
case fastReflect.Slice:
receiver.ReflectValue.Set(reflect.MakeSlice(receiver.ReflectType, 0, 0))
case fastReflect.Map:
receiver.ReflectValue.Set(reflect.MakeMap(receiver.ReflectType))
default:
if receiver.IsAddr {
receiver.ReflectValue.Set(reflect.New(receiver.ReflectType))
} else {
receiver.ReflectValue.Set(reflect.New(receiver.ReflectType).Elem())
}
}
receiver.setReflectValue(reflect.Indirect(receiver.ReflectValue))
}
}
// Addr 如果之前是指针,则赋值完后恢复回指针类型
// 否则如果将当前字段做为其它字段的值进行赋值时,就会出现 指针 = 非指针 赋值时的异常
func (receiver *valueMeta) Addr() {
if receiver.IsAddr {
receiver.ReflectValue = receiver.ReflectValue.Addr()
}
}