Skip to content

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

Open
@TeodorPt

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

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions