Решение оказалось проще, чем я думал, и не требовало использования тегов, как я изначально думал.
Я добавил новый .Equals()
метод:
func (e *Example) Equals(e2 *Example) bool {
unexportedFieldsOpt := cmp.AllowUnexported(Example{})
fieldsToIgnore := cmpopts.IgnoreFields(Example{}, "UnpersistedField")
return cmp.Equal(e, e2, unexportedFieldsOpt, fieldsToIgnore)
}
Это приводит к нормальному сравнению с использованием cmp.Equal()
, но некоторые поля игнорируются при сравнении, т. Е. Поля, которые не сохраняются в базе данных, и поэтому нам не нужно знать, изменились ли они.
Это лучшее решение, потому что мне больше не нужно редактировать метод каждый раз, когда структура получает новое поле, если только это поле не сохраняется. Кроме того, код намного аккуратнее и не продолжает расти по мере увеличения числа полей в структуре, в отличие от исходного примера в моем вопросе.
Он использует отражение, но кажется, что это было неизбежно, даже если я что-то сделал с тегами.
Я переименовал его из .Equal()
, потому что cmp.Equal(e1, e2)
автоматически ищет собственный метод .Equal()
, который будет использоваться для сравнения, но мой также вызывает cmp.Equal(e1, e2)
, так что это вызовет бесконечную рекурсию.