我正在嘗試使用Gorm為我的 api構建一個通用的 CrudRepository 結構。我知道泛型會在 GoLang 版本 2 中出現,但我嘗試使用反射或任何其他庫來構建這個庫。
在我的 CrudRepository 中:
func (repository *BaseRepository) find(result interface{}, pageSize int, page int) error {
if page < 1 {
return errors.ExceedsMinimumInt("page", "", 0, true, nil)
}
offset := (page - 1) * pageSize
ent := reflect.Zero(reflect.TypeOf(result))
repository.db = repository.db.Limit(pageSize).Offset(offset)
err := repository.db.Find(&ent).Error
result = ent
if err != nil {
return err
}
return nil
}
并呼叫此方法……例如:
func List(){
var entityList []MyEntity
find(entityList, 1, 10)
}
我想,我不能將任何介面參考傳遞給Gorm.db.Find()方法還有其他方法可以成功嗎?
uj5u.com熱心網友回復:
使用切片的指標作為自定義 find方法的輸入引數。
func (repository *BaseRepository) find(result interface{}, pageSize int, page int) error {
if page < 1 {
return errors.ExceedsMinimumInt("page", "", 0, true, nil)
}
if reflect.TypeOf(result).Kind() != reflect.Slice { ?? check ??
return errors.New("`result` is not a slice")
}
offset := (page - 1) * pageSize
db = db.Limit(pageSize).Offset(offset)
if err := db.Find(result).Error; err != nil {
return err
}
return nil
}
用法????
var entityList []MyEntity
err := find(&entityList, 10, 1)
您還必須檢查輸入引數(result),因為db.Find不適合找到單個支柱 ????(檢索單個物件)
如果你想避免 ErrRecordNotFound 錯誤,你可以像 db.Limit(1).Find(&user) 一樣使用 Find,Find 方法接受結構和切片資料
例如(Book表為空):
b := Book{}
rowsAffectedQuantity := db.Find(&b).RowsAffected // ?? 0
err = db.Find(&b).Error // ?? nil
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/311195.html
上一篇:打字稿編譯器不強制執行泛型
下一篇:通用陣列初始化
