fix: prevent interface type array from causing runtime errors

This commit is contained in:
KEHyeon 2025-04-13 17:27:54 +09:00
parent a9d27293de
commit 3ecd07bfaf
2 changed files with 31 additions and 0 deletions

View File

@ -121,6 +121,28 @@ func (p *processor) Execute(db *DB) *DB {
stmt.ReflectValue = stmt.ReflectValue.Elem() stmt.ReflectValue = stmt.ReflectValue.Elem()
} }
if (stmt.ReflectValue.Kind() == reflect.Slice || stmt.ReflectValue.Kind() == reflect.Array) &&
(stmt.ReflectValue.Len() > 0 || stmt.ReflectValue.Index(0).Kind() == reflect.Interface) {
len := stmt.ReflectValue.Len()
firstElem := stmt.ReflectValue.Index(0)
for firstElem.Kind() == reflect.Interface || firstElem.Kind() == reflect.Ptr {
firstElem = firstElem.Elem()
}
elemType := firstElem.Type()
sliceType := reflect.SliceOf(elemType)
structArrayReflectValue := reflect.MakeSlice(sliceType, 0, len)
for i := 0; i < len; i++ {
elem := stmt.ReflectValue.Index(i)
for elem.Kind() == reflect.Interface || elem.Kind() == reflect.Ptr {
elem = elem.Elem()
}
structArrayReflectValue = reflect.Append(structArrayReflectValue, elem)
}
stmt.ReflectValue = structArrayReflectValue
fmt.Println(stmt.ReflectValue.Type())
}
if !stmt.ReflectValue.IsValid() { if !stmt.ReflectValue.IsValid() {
db.AddError(ErrInvalidValue) db.AddError(ErrInvalidValue)
} }

View File

@ -138,6 +138,15 @@ func ParseWithSpecialTableName(dest interface{}, cacheStore *sync.Map, namer Nam
modelType = modelType.Elem() modelType = modelType.Elem()
} }
if modelType.Kind() == reflect.Interface {
if value.Len() > 0 {
modelType = reflect.Indirect(value.Index(0)).Elem().Type()
}
if modelType.Kind() == reflect.Ptr {
modelType = modelType.Elem()
}
}
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)