Skip to content

Commit d082b55

Browse files
committed
#### Version 0.7.4
* Feature: AutoMapper&Mapper support mapper struct to map[string]interface{} * Refactor: set MapperMapSlice to Deprecated, will remove on v1.0 * About AutoMapper:: ``` func Test_AutoMapper_StructToMap(t *testing.T) { from := &FromStruct{Name: "From", Sex: true, AA: "AA"} to := make(map[string]interface{}) err := AutoMapper(from, &to) if err != nil { t.Error("RunResult error: mapper error", err) } else { if to["UserName"] == "From"{ t.Log("RunResult success:", to) }else{ t.Error("RunResult failed: map[UserName]", to["UserName"]) } } } ``` * 2020-06-07 16:00 in ShangHai
1 parent 7b11061 commit d082b55

5 files changed

Lines changed: 74 additions & 8 deletions

File tree

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,9 @@ userMap: &{map 10 x1asd 100 2017-11-20 13:45:56.3972504 +0800 CST m=+0.006004001
8080
* 支持不同结构体相同名称相同类型字段自动赋值,使用Mapper
8181
* 支持不同结构体Slice的自动赋值,使用MapperSlice
8282
* 支持字段为结构体时的自动赋值
83+
* 支持struct到map的自动映射赋值,使用Mapper
8384
* 支持map到struct的自动映射赋值,使用MapperMap
84-
* 支持map到struct slice的自动赋值,使用MapperMapSlice
85+
* 支持map到struct slice的自动赋值,使用MapToSlice
8586
* 支持map与json的互相转换
8687
* 支持Time与Unix自动转换
8788
* 支持tag标签,tag关键字为 mapper

mapper.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ var (
2222
)
2323

2424
const (
25-
packageVersion = "0.6"
25+
packageVersion = "0.7.4"
2626
mapperTagKey = "mapper"
2727
jsonTagKey = "json"
2828
IgnoreTagValue = "-"
@@ -110,10 +110,12 @@ func registerValue(objValue reflect.Value) error {
110110
}
111111

112112
typeName := regValue.Type().String()
113-
for i := 0; i < regValue.NumField(); i++ {
114-
mapFieldName := typeName + nameConnector + GetFieldName(regValue, i)
115-
realFieldName := regValue.Type().Field(i).Name
116-
fieldNameMap.Store(mapFieldName, realFieldName)
113+
if regValue.Type().Kind() == reflect.Struct {
114+
for i := 0; i < regValue.NumField(); i++ {
115+
mapFieldName := typeName + nameConnector + GetFieldName(regValue, i)
116+
realFieldName := regValue.Type().Field(i).Name
117+
fieldNameMap.Store(mapFieldName, realFieldName)
118+
}
117119
}
118120

119121
//store register flag
@@ -240,7 +242,7 @@ func MapToSlice(fromMap map[string]interface{}, toSlice interface{}) error {
240242

241243
// MapperMapSlice mapper from map[string]map[string]interface{} to a slice of any type's ptr
242244
// toSlice must be a slice of any type.
243-
// Deprecated: Use the PostFormValue instead
245+
// Deprecated: will remove on v1.0, please use MapToSlice instead
244246
func MapperMapSlice(fromMaps map[string]map[string]interface{}, toSlice interface{}) error {
245247
var err error
246248
toValue := reflect.ValueOf(toSlice)

mapper_internal.go

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,16 @@ func elemMapper(fromElem, toElem reflect.Value) error {
1616
if !checkIsRegister(toElem) {
1717
registerValue(toElem)
1818
}
19+
if toElem.Type().Kind() == reflect.Map {
20+
elemToMap(fromElem, toElem)
21+
} else {
22+
elemToStruct(fromElem, toElem)
23+
}
24+
25+
return nil
26+
}
1927

28+
func elemToStruct(fromElem, toElem reflect.Value) {
2029
for i := 0; i < fromElem.NumField(); i++ {
2130
fromFieldInfo := fromElem.Field(i)
2231
fieldName := GetFieldName(fromElem, i)
@@ -64,7 +73,14 @@ func elemMapper(fromElem, toElem reflect.Value) error {
6473
}
6574

6675
}
67-
return nil
76+
}
77+
78+
func elemToMap(fromElem, toElem reflect.Value) {
79+
for i := 0; i < fromElem.NumField(); i++ {
80+
fromFieldInfo := fromElem.Field(i)
81+
fieldName := GetFieldName(fromElem, i)
82+
toElem.SetMapIndex(reflect.ValueOf(fieldName), fromFieldInfo)
83+
}
6884
}
6985

7086
func setFieldValue(fieldValue reflect.Value, fieldKind reflect.Kind, value interface{}) error {

mapper_test.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,21 @@ func Test_AutoMapper(t *testing.T) {
167167
}
168168
}
169169

170+
func Test_AutoMapper_StructToMap(t *testing.T) {
171+
from := &FromStruct{Name: "From", Sex: true, AA: "AA"}
172+
to := make(map[string]interface{})
173+
err := AutoMapper(from, &to)
174+
if err != nil {
175+
t.Error("RunResult error: mapper error", err)
176+
} else {
177+
if to["UserName"] == "From" {
178+
t.Log("RunResult success:", to)
179+
} else {
180+
t.Error("RunResult failed: map[UserName]", to["UserName"])
181+
}
182+
}
183+
}
184+
170185
func Test_MapperMap(t *testing.T) {
171186
validateTime, _ := time.Parse("2006-01-02 15:04:05", "2017-01-01 10:00:00")
172187
fromMap := make(map[string]interface{})
@@ -319,6 +334,15 @@ func BenchmarkAutoMapper(b *testing.B) {
319334
}
320335
}
321336

337+
func BenchmarkAutoMapper_Map(b *testing.B) {
338+
from := &FromStruct{Name: "From", Sex: true, AA: "AA"}
339+
to := make(map[string]interface{})
340+
341+
for i := 0; i < b.N; i++ {
342+
Mapper(from, &to)
343+
}
344+
}
345+
322346
func BenchmarkMapperMap(b *testing.B) {
323347
Register(&testStruct{})
324348
fromMap := make(map[string]interface{})

version.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,28 @@
11
## devfeel/mapper
22

3+
4+
#### Version 0.7.4
5+
* Feature: AutoMapper&Mapper support mapper struct to map[string]interface{}
6+
* Refactor: set MapperMapSlice to Deprecated, will remove on v1.0
7+
* About AutoMapper::
8+
```
9+
func Test_AutoMapper_StructToMap(t *testing.T) {
10+
from := &FromStruct{Name: "From", Sex: true, AA: "AA"}
11+
to := make(map[string]interface{})
12+
err := AutoMapper(from, &to)
13+
if err != nil {
14+
t.Error("RunResult error: mapper error", err)
15+
} else {
16+
if to["UserName"] == "From"{
17+
t.Log("RunResult success:", to)
18+
}else{
19+
t.Error("RunResult failed: map[UserName]", to["UserName"])
20+
}
21+
}
22+
}
23+
```
24+
* 2020-06-07 16:00 in ShangHai
25+
326
#### Version 0.7.3
427
* Feature: add MapToSlice to mapper from map[string]interface{} to a slice of any type's ptr
528
* Refactor: set MapperMapSlice to Deprecated, will remove on v1.0

0 commit comments

Comments
 (0)