google / google/go-cmp

cmpopts.IgnoreFields does not work on structs with an Equal method

Open
#352 2 comments 1 reaction 0 assignees View on GitHub
Dominant language
Go
Stars
4.7k
Forks
243
PR merge metrics
No merged PRs in 30d

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](https://pkg.go.dev/github.com/google/go-cmp/cmp#Equal).

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

```golang
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!

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.