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)
|
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
14
type.go
@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user