1
0

distinguish struct and time

This commit is contained in:
Arpad Ryszka 2025-09-01 01:59:03 +02:00
parent af0bbca22e
commit 9a6db08a25
2 changed files with 14 additions and 10 deletions

View File

@ -76,7 +76,7 @@ func fields(t reflect.Type) []Field {
t = unpackType(t, pointer) t = unpackType(t, pointer)
list := t.Kind() == reflect.Slice list := t.Kind() == reflect.Slice
t = unpackType(t, pointer|slice) t = unpackType(t, pointer|slice)
if t.Kind() != reflect.Struct { if !isStruct(t) {
return nil return nil
} }
@ -178,7 +178,7 @@ func fieldValues(v reflect.Value) []Field {
return scalarMapFields(v) return scalarMapFields(v)
} }
if t.Kind() != reflect.Struct { if !isStruct(t) {
return nil return nil
} }
@ -191,7 +191,7 @@ func fieldValues(v reflect.Value) []Field {
vfi := v.Field(i) vfi := v.Field(i)
vfi = unpackValue(vfi, pointer|iface|anytype) vfi = unpackValue(vfi, pointer|iface|anytype)
switch { switch {
case vfi.Kind() == reflect.Struct && tfi.Anonymous: case tfi.Anonymous:
ff := fieldValues(vfi) ff := fieldValues(vfi)
f = append(f, ff...) f = append(f, ff...)
default: default:
@ -388,7 +388,7 @@ func bindField(receiver reflect.Value, values []Field) bool {
return bindMapField(fieldReceiver, values) return bindMapField(fieldReceiver, values)
} }
if fieldReceiver.Kind() == reflect.Struct { if isStruct(fieldReceiver.Type()) {
return bindStructField(fieldReceiver, values) return bindStructField(fieldReceiver, values)
} }
@ -400,7 +400,7 @@ func bindField(receiver reflect.Value, values []Field) bool {
ut := unpackType(t, pointer) ut := unpackType(t, pointer)
if ut.Kind() == reflect.Slice || if ut.Kind() == reflect.Slice ||
isScalarMap(ut) || isScalarMap(ut) ||
ut.Kind() == reflect.Struct { isStruct(ut) {
l := 1 l := 1
if ut.Kind() == reflect.Slice { if ut.Kind() == reflect.Slice {
l = len(values) l = len(values)

14
type.go
View File

@ -95,11 +95,11 @@ func checkHasCircularType(visited map[reflect.Type]bool, t reflect.Type) bool {
return true return true
} }
switch t.Kind() { switch {
case reflect.Pointer, reflect.Slice: case t.Kind() == reflect.Pointer || t.Kind() == reflect.Slice:
visited = setVisited(visited, t) visited = setVisited(visited, t)
return checkHasCircularType(visited, t.Elem()) return checkHasCircularType(visited, t.Elem())
case reflect.Struct: case isStruct(t):
visited = setVisited(visited, t) visited = setVisited(visited, t)
for i := 0; i < t.NumField(); i++ { for i := 0; i < t.NumField(); i++ {
if checkHasCircularType(visited, t.Field(i).Type) { 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 { func isScalarMap(t reflect.Type) bool {
if t.Kind() != reflect.Map { if t.Kind() != reflect.Map {
return false return false
@ -274,7 +278,7 @@ func acceptsScalar(t reflect.Type) bool {
func acceptsFields(t reflect.Type) bool { func acceptsFields(t reflect.Type) bool {
t = unpackType(t, pointer|slice) t = unpackType(t, pointer|slice)
return t.Kind() == reflect.Struct || isScalarMap(t) return isStruct(t) || isScalarMap(t)
} }
func acceptsList(t reflect.Type) bool { 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 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) p := reflect.New(t)
return p.Elem(), len == 1 return p.Elem(), len == 1
} }