Skip to content
Snippets Groups Projects
Commit 2dbef390 authored by Xin.Zh's avatar Xin.Zh Committed by 邹毅贤
Browse files

Merge pull request #822 from fangyincheng/fix-generic

fix generic struct2MapAll
parent c145280a
No related branches found
No related tags found
No related merge requests found
......@@ -21,6 +21,7 @@ import (
"context"
"reflect"
"strings"
"time"
)
import (
......@@ -93,13 +94,21 @@ func struct2MapAll(obj interface{}) interface{} {
if t.Kind() == reflect.Struct {
result := make(map[string]interface{}, t.NumField())
for i := 0; i < t.NumField(); i++ {
if v.Field(i).Kind() == reflect.Struct || v.Field(i).Kind() == reflect.Slice || v.Field(i).Kind() == reflect.Map {
if v.Field(i).CanInterface() {
setInMap(result, t.Field(i), struct2MapAll(v.Field(i).Interface()))
field := t.Field(i)
value := v.Field(i)
kind := value.Kind()
if kind == reflect.Struct || kind == reflect.Slice || kind == reflect.Map {
if value.CanInterface() {
tmp := value.Interface()
if _, ok := tmp.(time.Time); ok {
setInMap(result, field, tmp)
continue
}
setInMap(result, field, struct2MapAll(tmp))
}
} else {
if v.Field(i).CanInterface() {
setInMap(result, t.Field(i), v.Field(i).Interface())
if value.CanInterface() {
setInMap(result, field, value.Interface())
}
}
}
......
......@@ -20,6 +20,7 @@ package filter_impl
import (
"reflect"
"testing"
"time"
)
import (
......@@ -38,6 +39,8 @@ func TestStruct2MapAll(t *testing.T) {
Xx string `m:"xx"`
} `m:"xxYy"`
} `m:"caCa"`
DaDa time.Time
EeEe int
}
testData.AaAa = "1"
testData.BaBa = "1"
......@@ -45,6 +48,8 @@ func TestStruct2MapAll(t *testing.T) {
testData.CaCa.AaAa = "2"
testData.CaCa.XxYy.xxXx = "3"
testData.CaCa.XxYy.Xx = "3"
testData.DaDa = time.Date(2020, 10, 29, 2, 34, 0, 0, time.Local)
testData.EeEe = 100
m := struct2MapAll(testData).(map[string]interface{})
assert.Equal(t, "1", m["aaAa"].(string))
assert.Equal(t, "1", m["baBa"].(string))
......@@ -53,6 +58,8 @@ func TestStruct2MapAll(t *testing.T) {
assert.Equal(t, reflect.Map, reflect.TypeOf(m["caCa"]).Kind())
assert.Equal(t, reflect.Map, reflect.TypeOf(m["caCa"].(map[string]interface{})["xxYy"]).Kind())
assert.Equal(t, "2020-10-29 02:34:00", m["daDa"].(time.Time).Format("2006-01-02 15:04:05"))
assert.Equal(t, 100, m["eeEe"].(int))
}
type testStruct struct {
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment