在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
相关产品推荐
相关产品推荐

