cmpopts.IgnoreFields does not work on structs with an Equal method #352
Open
Description
Summary
If a struct has a method of the form (T) Equal(T) bool
, cmp.Equal
is using that instead of the default evaluation process, as documented in the Godoc.
If one wants to use options such as cmpopts.IgnoreFields
, they are ignored, because the rule above takes precedence.
In some situations (e.g. in tests), it might be useful to be able to ignore fields even on structs that have an Equal
method.
Example
package main
import (
"fmt"
"github.com/google/go-cmp/cmp"
"github.com/google/go-cmp/cmp/cmpopts"
)
type Entry struct {
ID string
Name string
}
func (e Entry) Equal(other Entry) bool {
return e.ID == other.ID && e.Name == other.Name
}
func main() {
a := Entry{
ID: "123",
Name: "EntryA",
}
b := Entry{
ID: "124",
Name: "EntryA",
}
// Returns false, as expected.
fmt.Println(cmp.Equal(a, b))
// Also returns false, though one might expect true from reading this statement.
fmt.Println(cmp.Equal(a, b, cmpopts.IgnoreFields(Entry{}, "ID")))
}
Suggestion
An idea would be to provide an additional Option
to ignore the struct's Equal
method even if it exists.
Please let me know if there's already a way to bypass this that I might have missed.
Thanks!
Metadata
Assignees
Labels
No labels