Я разрабатываю API с большим количеством моделей, использующих go-gorm. До сих пор для функции "GetAll" я использовал следующее (упрощенное):
func GetAllUsers(w,r){
//... get params and do some check
pages := []*models.User{} //<-main problem I have to give the full type
models.GetDB().Model(&models.User{}).Offset(offset).Limit(pagesize).Find(&pages)
//do the http response(w,pages)
}
Но я бы хотел избежать копирования / вставки функции, чтобы просто изменить тип (здесь models.User), чтобы получить все модели из db.
Я пробовал другой подход с использованием отражения или интерфейса, но, похоже, ни один из них не работает так:
func GenericGetAll(w http.ResponseWriter, r *http.Request, data interface{}) {
dtype := reflect.TypeOf(data)
pages := reflect.New(reflect.SliceOf(dtype)).Elem().Interface()
log.Printf("%+v", pages)
//reflect.MakeSlice(reflect.SliceOf(reflect.TypeOf(data)), 0, 20)
//new([]gorm.Model)
GetDB().LogMode(true).Model(data).Offset(offset).Limit(pagesize).Find(&pages)
utils.Respond(w, pages)
}
Так что я мог бы использовать это прямо в своих обработчиках:
GenericGetAll(w,r,&models.User{}) for user
GenericGetAll(w,r,&models.Product{}) for Product
GenericGetAll(w,r,&models.Company{}) for Company
Это было бы чище, чем копирование / вставка другой функции только для изменения типа ...
Но использование этого другого подхода создает проблемы:
- [] * interface {}, я теряю имя таблицы и получаю ошибку sql, потому что имя таблицы '' не существует
- new ([] gorm.Model) он теряет мое имя таблицы и использует имя таблицы по умолчанию gorm.model: /
- Reflect.New (lect.SliceOf (dtype)). Elem (). Interface (), и я получаю сообщение об ошибке: неподдерживаемый пункт назначения, должен быть срез или структура, даже если он действительно создал срез: / log.printf () дает пустой множество []
Как мне использовать отражение, чтобы получить фрагмент из аргумента типа в функции?
Это возможно только с Голангом? Я знаю, что полиморфизм не существует в голанге, но ... это обязательные функции или есть что-то волшебное, чего я не знаю о голанге? ^^.
Спасибо