-
Notifications
You must be signed in to change notification settings - Fork 9
Expand file tree
/
Copy pathstructEngineNew.go
More file actions
116 lines (94 loc) · 2.06 KB
/
structEngineNew.go
File metadata and controls
116 lines (94 loc) · 2.06 KB
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
package gorose
import (
"reflect"
)
// ========================
// 版本1:返回 []map[string]interface{}
// 支持:struct/*struct/[]struct/[]*struct
// ========================
func StructToMapSlices(data interface{}) []map[string]interface{} {
if data == nil {
return nil
}
v := reflect.ValueOf(data)
return autoParse(v)
}
// ========================
// 版本2:返回 map[string]interface{}
// 支持:struct/*struct
// 就是原版
// ========================
func StructToMapV2(data interface{}) map[string]interface{} {
if data == nil {
return nil
}
v := reflect.ValueOf(data)
// 解指针
for v.Kind() == reflect.Ptr {
if v.IsNil() {
return nil
}
v = v.Elem()
}
if v.Kind() != reflect.Struct {
return nil
}
return parseStruct(v)
}
// 自动解析
func autoParse(v reflect.Value) []map[string]interface{} {
for v.Kind() == reflect.Ptr {
if v.IsNil() {
return nil
}
v = v.Elem()
}
var res []map[string]interface{}
switch v.Kind() {
case reflect.Struct:
res = append(res, parseStruct(v))
case reflect.Slice, reflect.Array:
for i := 0; i < v.Len(); i++ {
item := v.Index(i)
for item.Kind() == reflect.Ptr {
item = item.Elem()
}
if item.Kind() == reflect.Struct {
res = append(res, parseStruct(item))
}
}
}
return res
}
// 解析结构体核心方法
func parseStruct(val reflect.Value) map[string]interface{} {
m := make(map[string]interface{})
typ := val.Type()
for i := 0; i < val.NumField(); i++ {
field := typ.Field(i)
fv := val.Field(i)
// 跳过私有字段
if field.PkgPath != "" {
continue
}
// 跳过嵌套结构体
if fv.Kind() == reflect.Struct {
continue
}
// 读取 gorose 标签
tag := field.Tag.Get(TAGNAME)
// 忽略标记
if tag == "ignore" {
continue
}
// ======================
// ✅ 关键:无标签 → 使用结构体原生字段名
// ======================
if tag == "" {
tag = field.Name // 这里就是自动使用原生名字
}
// 保留所有值:0 / "" / false 都不会丢
m[tag] = fv.Interface()
}
return m
}