首页 > 解决方案 > 检测任何模型值是否已更改的最简单方法

问题描述

我使用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)

有没有简单的方法来实现这一目标?

标签: goormgo-gorm

解决方案


我不知道这是否是最简单的方法,并且可能不是惯用的,但是您可以通过反射来完成此操作。以下函数使用反射包比较两个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
}

请注意,我是新手,所以我可能会在“正确”代码方面将您引入歧途。但这确实有效。


推荐阅读