diff --git a/field.go b/field.go index cc7366d..a0e4e8c 100644 --- a/field.go +++ b/field.go @@ -76,7 +76,7 @@ func fields(t reflect.Type) []Field { t = unpackType(t, pointer) list := t.Kind() == reflect.Slice t = unpackType(t, pointer|slice) - if t.Kind() != reflect.Struct { + if !isStruct(t) { return nil } @@ -178,7 +178,7 @@ func fieldValues(v reflect.Value) []Field { return scalarMapFields(v) } - if t.Kind() != reflect.Struct { + if !isStruct(t) { return nil } @@ -191,7 +191,7 @@ func fieldValues(v reflect.Value) []Field { vfi := v.Field(i) vfi = unpackValue(vfi, pointer|iface|anytype) switch { - case vfi.Kind() == reflect.Struct && tfi.Anonymous: + case tfi.Anonymous: ff := fieldValues(vfi) f = append(f, ff...) default: @@ -388,7 +388,7 @@ func bindField(receiver reflect.Value, values []Field) bool { return bindMapField(fieldReceiver, values) } - if fieldReceiver.Kind() == reflect.Struct { + if isStruct(fieldReceiver.Type()) { return bindStructField(fieldReceiver, values) } @@ -400,7 +400,7 @@ func bindField(receiver reflect.Value, values []Field) bool { ut := unpackType(t, pointer) if ut.Kind() == reflect.Slice || isScalarMap(ut) || - ut.Kind() == reflect.Struct { + isStruct(ut) { l := 1 if ut.Kind() == reflect.Slice { l = len(values) diff --git a/type.go b/type.go index 956b3bf..c35c27a 100644 --- a/type.go +++ b/type.go @@ -95,11 +95,11 @@ func checkHasCircularType(visited map[reflect.Type]bool, t reflect.Type) bool { return true } - switch t.Kind() { - case reflect.Pointer, reflect.Slice: + switch { + case t.Kind() == reflect.Pointer || t.Kind() == reflect.Slice: visited = setVisited(visited, t) return checkHasCircularType(visited, t.Elem()) - case reflect.Struct: + case isStruct(t): visited = setVisited(visited, t) for i := 0; i < t.NumField(); i++ { if checkHasCircularType(visited, t.Field(i).Type) { @@ -217,6 +217,10 @@ func isScalar(t reflect.Type) bool { } } +func isStruct(t reflect.Type) bool { + return !isTime(t) && t.Kind() == reflect.Struct +} + func isScalarMap(t reflect.Type) bool { if t.Kind() != reflect.Map { return false @@ -274,7 +278,7 @@ func acceptsScalar(t reflect.Type) bool { func acceptsFields(t reflect.Type) bool { t = unpackType(t, pointer|slice) - return t.Kind() == reflect.Struct || isScalarMap(t) + return isStruct(t) || isScalarMap(t) } func acceptsList(t reflect.Type) bool { @@ -344,7 +348,7 @@ func allocate(t reflect.Type, len int) (reflect.Value, bool) { return reflect.Zero(t), false } - if isAny(t) || isScalar(t) || t.Kind() == reflect.Struct { + if isAny(t) || isScalar(t) || isStruct(t) { p := reflect.New(t) return p.Elem(), len == 1 }