diff --git a/scan.go b/scan.go index d852c2c9f..ec78c1d67 100644 --- a/scan.go +++ b/scan.go @@ -202,6 +202,9 @@ func Scan(rows Rows, db *DB, mode ScanMode) { switch reflectValueType.Kind() { case reflect.Array, reflect.Slice: reflectValueType = reflectValueType.Elem() + if reflectValueType.Kind() == reflect.Interface && reflectValue.Len() > 0 { + reflectValueType = reflect.Indirect(reflectValue.Index(0)).Elem().Type() + } } isPtr := reflectValueType.Kind() == reflect.Ptr if isPtr { @@ -318,7 +321,9 @@ func Scan(rows Rows, db *DB, mode ScanMode) { } else { elem = reflect.New(reflectValueType) } - + if elem.Type().Kind() == reflect.Interface { + elem = elem.Elem() + } db.scanIntoStruct(rows, elem, values, fields, joinFields) if !update { diff --git a/schema/schema.go b/schema/schema.go index db2367975..17fdc317f 100644 --- a/schema/schema.go +++ b/schema/schema.go @@ -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 { 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.PkgPath() == "" { return nil, fmt.Errorf("%w: %+v", ErrUnsupportedDataType, dest)