fix: prevent interface type array from causing runtime errors

This commit is contained in:
KEHyeon 2025-01-27 00:46:47 +09:00
parent 8eebbb4687
commit 7fbb532cdb
2 changed files with 9 additions and 2 deletions

View File

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

View File

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