Merge pull request #77 from fatih/fix-interface-type-with-map-value
structs: fix interface{} type with map values
This commit is contained in:
commit
4d2cc36e7e
17
structs.go
17
structs.go
@ -530,15 +530,22 @@ func (s *Struct) nested(val reflect.Value) interface{} {
|
|||||||
finalVal = m
|
finalVal = m
|
||||||
}
|
}
|
||||||
case reflect.Map:
|
case reflect.Map:
|
||||||
v := val.Type().Elem()
|
// get the element type of the map
|
||||||
if v.Kind() == reflect.Ptr {
|
mapElem := val.Type()
|
||||||
v = v.Elem()
|
switch val.Type().Kind() {
|
||||||
|
case reflect.Ptr, reflect.Array, reflect.Map,
|
||||||
|
reflect.Slice, reflect.Chan:
|
||||||
|
mapElem = val.Type().Elem()
|
||||||
|
if mapElem.Kind() == reflect.Ptr {
|
||||||
|
mapElem = mapElem.Elem()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// only iterate over struct types, ie: map[string]StructType,
|
// only iterate over struct types, ie: map[string]StructType,
|
||||||
// map[string][]StructType,
|
// map[string][]StructType,
|
||||||
if v.Kind() == reflect.Struct ||
|
if mapElem.Kind() == reflect.Struct ||
|
||||||
(v.Kind() == reflect.Slice && v.Elem().Kind() == reflect.Struct) {
|
(mapElem.Kind() == reflect.Slice &&
|
||||||
|
mapElem.Elem().Kind() == reflect.Struct) {
|
||||||
m := make(map[string]interface{}, val.Len())
|
m := make(map[string]interface{}, val.Len())
|
||||||
for _, k := range val.MapKeys() {
|
for _, k := range val.MapKeys() {
|
||||||
m[k.String()] = s.nested(val.MapIndex(k))
|
m[k.String()] = s.nested(val.MapIndex(k))
|
||||||
|
|||||||
@ -1426,3 +1426,28 @@ func TestPointer2Pointer(t *testing.T) {
|
|||||||
c := &b
|
c := &b
|
||||||
_ = Map(&c)
|
_ = Map(&c)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestMap_InterfaceTypeWithMapValue(t *testing.T) {
|
||||||
|
type A struct {
|
||||||
|
Name string `structs:"name"`
|
||||||
|
Ip string `structs:"ip"`
|
||||||
|
Query string `structs:"query"`
|
||||||
|
Payload interface{} `structs:"payload"`
|
||||||
|
}
|
||||||
|
|
||||||
|
a := A{
|
||||||
|
Name: "test",
|
||||||
|
Ip: "127.0.0.1",
|
||||||
|
Query: "",
|
||||||
|
Payload: map[string]string{"test_param": "test_param"},
|
||||||
|
}
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
err := recover()
|
||||||
|
if err != nil {
|
||||||
|
t.Error("Converting Map with an interface{} type with map value should not panic")
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
_ = Map(a)
|
||||||
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user