go - 检测任何模型值是否已更改的最简单方法
问题描述
我使用gorm作为 Golang ORM。我需要检测是否有任何模型字段已更改以触发第三方 API 服务的更新。
我尝试使用 If 语句测试每个字段,但是当模型有很多字段时它会变得很难看。
var person Person
db.Where("id = ?", id).First(&person)
if person.Name != body.Person.Name || person.Age != body.Person.Age {
// Trigger API update
}
db.Save(&person)
有没有简单的方法来实现这一目标?
解决方案
我不知道这是否是最简单的方法,并且可能不是惯用的,但是您可以通过反射来完成此操作。以下函数使用反射包比较两个Person
结构,以查看它们的每个字段的值是否相同,跳过Model
结构(其内部变化独立于所代表的数据元素Person
)。
func (this Person) Equals(that Person) bool {
vThis := reflect.ValueOf(this)
vThat := reflect.ValueOf(that)
for i := 0; i < vThis.NumField(); i++ {
if vThis.Field(i) != vThis.FieldByName("Model") {
if vThis.Field(i).Interface() != vThat.Field(i).Interface() {
return false
}
}
}
return true
}
您可以在代码片段中使用它,如下所示:
if !person.Equals(body.Person) {
// Trigger API update
}
请注意,我是新手,所以我可能会在“正确”代码方面将您引入歧途。但这确实有效。
推荐阅读
- php - Yii2中某些页面的布局相同
- python - 如何在 python 烧瓶的新选项卡中打开响应
- openedge - 如何通过减少以下代码来提高流程性能?
- apache-spark - 使用 Jackson 2.8 版的 Spark 应用程序与 Apache Spark 1.6 不兼容
- reactjs - 将输入数据保存在异步存储上
- image - tf.image.convert_image_dtype(image, dtype=tf.uint8) 之后的混淆图像
- php - 在 unix cron 中从 php 调用函数
- python - pandas-分类变量的百分比计数
- azure-api-management - APIM 组合节流策略方法
- javascript - TypeError:无法解构“未定义”或“空”的属性“编译”