distinguish struct and time
This commit is contained in:
parent
af0bbca22e
commit
9a6db08a25
10
field.go
10
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)
|
||||
|
||||
14
type.go
14
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
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user