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)
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)

14
type.go
View File

@ -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
}