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

在Gorm中能否将代表数据模型结构体的接口传入Find方法?

答案:是

不过你的示例代码存在一个关键问题——调用MyFunc时需要传递切片的指针,而不是切片本身,否则Gorm无法修改原切片的内容(因为Go中切片是值传递,函数内操作的只是拷贝)。下面是可直接运行的完整示例:

package main

import (
  "gorm.io/driver/sqlite"
  "gorm.io/gorm"
)

// Project 定义数据模型结构体
type Project struct {
  gorm.Model
  Name string
}

// MyFunc 接收结果的接口类型参数(需传入指针)
func MyFunc(results interface{}, db *gorm.DB) error {
  query := "SELECT * FROM projects"
  // 注意:这里直接使用results,无需再加&,因为传入的已经是指针
  err := db.Raw(query).Find(results).Error
  return err
}

func main() {
  // 初始化SQLite数据库连接
  db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
  if err != nil {
    panic("数据库连接失败:" + err.Error())
  }

  // 自动迁移生成数据表
  db.AutoMigrate(&Project{})

  // 插入测试数据(用于验证查询效果)
  db.Create(&Project{Name: "电商平台项目"})
  db.Create(&Project{Name: "数据分析系统"})

  // 调用MyFunc,必须传递切片的指针
  var projects []*Project
  err = MyFunc(&projects, db)
  if err != nil {
    panic("查询失败:" + err.Error())
  }

  // 输出查询结果
  for _, p := range projects {
    println("项目名称:", p.Name)
  }
}

核心注意点:

  • 调用MyFunc时必须传结果集合的指针(比如&projects),否则Gorm无法将查询结果写入到外部的变量中。
  • 在MyFunc内部,Find方法直接使用传入的results即可,不需要额外取地址,因为它本身已经是指向目标集合的指针。

内容的提问来源于stack exchange,提问作者eurvanov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 10:17:44