如何在Go中借助反射实现支持interface的Gorm通用CrudRepository
解决方案
问题根因
- 调用
find方法时传入的是切片值而非指针,方法内部无法修改外部变量的实际值 - 原代码中通过
reflect.Zero创建临时反射实例,赋值给result参数的操作不生效:Go是值传递,result只是入参的拷贝,赋值不会同步到外部原始变量 - Gorm的
Find方法本身就支持interface{}类型的指针入参,无需额外通过反射创建中间实例
修正代码
BaseRepository的find方法
func (repository *BaseRepository) find(result interface{}, pageSize int, page int) error { if page < 1 { return errors.ExceedsMinimumInt("page", "", 0, true, nil) } // 可选:增加入参校验,避免非指针入参导致查询结果不生效 if reflect.ValueOf(result).Kind() != reflect.Ptr { return errors.New("result parameter must be a pointer") } offset := (page - 1) * pageSize return repository.db.Limit(pageSize).Offset(offset).Find(result).Error }
调用示例
func List(){ var entityList []MyEntity // 必须传入切片的指针作为入参 err := find(&entityList, 1, 10) if err != nil { // 自行处理错误逻辑 } }
内容的提问来源于stack exchange,提问作者yeulucay
相关产品推荐
相关产品推荐

