fix: prevent interface type array from causing runtime errors
This commit is contained in:
parent
8eebbb4687
commit
7fbb532cdb
7
scan.go
7
scan.go
@ -202,6 +202,9 @@ func Scan(rows Rows, db *DB, mode ScanMode) {
|
|||||||
switch reflectValueType.Kind() {
|
switch reflectValueType.Kind() {
|
||||||
case reflect.Array, reflect.Slice:
|
case reflect.Array, reflect.Slice:
|
||||||
reflectValueType = reflectValueType.Elem()
|
reflectValueType = reflectValueType.Elem()
|
||||||
|
if reflectValueType.Kind() == reflect.Interface && reflectValue.Len() > 0 {
|
||||||
|
reflectValueType = reflect.Indirect(reflectValue.Index(0)).Elem().Type()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
isPtr := reflectValueType.Kind() == reflect.Ptr
|
isPtr := reflectValueType.Kind() == reflect.Ptr
|
||||||
if isPtr {
|
if isPtr {
|
||||||
@ -318,7 +321,9 @@ func Scan(rows Rows, db *DB, mode ScanMode) {
|
|||||||
} else {
|
} else {
|
||||||
elem = reflect.New(reflectValueType)
|
elem = reflect.New(reflectValueType)
|
||||||
}
|
}
|
||||||
|
if elem.Type().Kind() == reflect.Interface {
|
||||||
|
elem = elem.Elem()
|
||||||
|
}
|
||||||
db.scanIntoStruct(rows, elem, values, fields, joinFields)
|
db.scanIntoStruct(rows, elem, values, fields, joinFields)
|
||||||
|
|
||||||
if !update {
|
if !update {
|
||||||
|
@ -136,8 +136,10 @@ func ParseWithSpecialTableName(dest interface{}, cacheStore *sync.Map, namer Nam
|
|||||||
|
|
||||||
for modelType.Kind() == reflect.Slice || modelType.Kind() == reflect.Array || modelType.Kind() == reflect.Ptr {
|
for modelType.Kind() == reflect.Slice || modelType.Kind() == reflect.Array || modelType.Kind() == reflect.Ptr {
|
||||||
modelType = modelType.Elem()
|
modelType = modelType.Elem()
|
||||||
|
if modelType.Kind() == reflect.Interface && value.Len() > 0 {
|
||||||
|
modelType = reflect.Indirect(value.Index(0)).Elem().Type()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if modelType.Kind() != reflect.Struct {
|
if modelType.Kind() != reflect.Struct {
|
||||||
if modelType.PkgPath() == "" {
|
if modelType.PkgPath() == "" {
|
||||||
return nil, fmt.Errorf("%w: %+v", ErrUnsupportedDataType, dest)
|
return nil, fmt.Errorf("%w: %+v", ErrUnsupportedDataType, dest)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user