关于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