关于gorm中通过反射遍历Statement.Model时遇到model未实现接口的问题

1. 运行环境

go版本 1.20.2

2. 问题描述?

定义了一个model并且实现了一个接口
type User struct {
ID uint gorm:"primarykey" json:"id"
UserName string json:"userName"
Mobile string json:"mobile"
Password string json:"password"
CreateTime uint gorm:"autoCreateTime" json:"createTime"
UpdateTime uint gorm:"autoUpdateTime" json:"updateTime"
}
func (u *User) getPrimaryKey() string {
return “ID”
}
type ModelInterface interface {
getPrimaryKey() string //获取主键名
}
然后给gorm的连接实例添加监控
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
_ = db.Callback().Query().Register(“after:query”, afterQuery)
下面是afterQuery定义,如果db.Statement.Model是指针数组会遍历它并依次传入FlushCache调用,该方法的参数需实现ModelInterface接口
func afterQuery(db *gorm.DB) {
models := db.Statement.Model
rm := reflect.ValueOf(models).Elem()
if rm.Kind() == reflect.Slice {
length := rm.Len()
for i := 0; i < length; i++ {
model := rm.Index(i).Interface().(ModelInterface)
FlushCache(model)
}
} else {

}
}

func FlushCache(model ModelInterface) {

}

下面是main函数
func main() {
initConfig()
users := []models.User{}
db := models.GetInstanceDb()
db.First(&users)
}

3. 您期望得到的结果?

通过遍历得到的model已经实现了接口,model := rm.Index(i).Interface().(ModelInterface) 这里可以正常断言

4. 您实际得到的结果?

提示没有实现该接口
报错如下:
panic: interface conversion: models.User is not models.ModelInterface: missing method getPrimaryKey

关于gorm中通过反射遍历Statement.Model时遇到model未实现接口的问题

讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!