You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 01:57:04