GithubHelp home page GithubHelp logo

Comments (9)

dsnet avatar dsnet commented on August 19, 2024 2

The current paragraph that describes usage of the Equal method currently says:

  • If the values have an Equal method of the form "(T) Equal(T) bool" or "(T) Equal(I) bool" where T is assignable to I, then use the result of x.Equal(y). Otherwise, no such method exists and evaluation proceeds to the next rule.

If it helps, I can add a phrase to suggest this edge case:

  • If the values have an Equal method of the form "(T) Equal(T) bool" or "(T) Equal(I) bool" where T is assignable to I, then use the result of x.Equal(y) even if x or y are nil pointers. Otherwise, no such method exists and evaluation proceeds to the next rule.

Would that help?

from go-cmp.

dsnet avatar dsnet commented on August 19, 2024

Go has no operator overloading for ==, so the Equal method has become the typical way that many objects declare how to compare themselves. This pattern occurs in the standard library, and an analysis of other Go code indicated that this was a common enough pattern to special case:

crypto/x509/x509.go:752:func (c *Certificate) Equal(other *Certificate) bool {
regexp/syntax/regexp.go:62:func (x *Regexp) Equal(y *Regexp) bool {
encoding/asn1/asn1.go:224:func (oi ObjectIdentifier) Equal(other ObjectIdentifier) bool {
time/time.go:252:func (t Time) Equal(u Time) bool {
net/ip.go:375:func (ip IP) Equal(x IP) bool {

from go-cmp.

filmil avatar filmil commented on August 19, 2024

I understand.

The reason I reported this was because of kubernetes/apimachinery@44878ce#diff-221c91463b9db024401e40d997ec741c

Turns out, I was looking at an old version of K8S source that had a problem here.

It would be nice, however, if go-cmp had some place that documented what requirements there are on Equal().

from go-cmp.

filmil avatar filmil commented on August 19, 2024

from go-cmp.

filmil avatar filmil commented on August 19, 2024

from go-cmp.

dsnet avatar dsnet commented on August 19, 2024

#63

from go-cmp.

dsnet avatar dsnet commented on August 19, 2024

For future reference: I don't think we would ever change the semantics of when the Equal method is called since it useful for certain types to declare that the nil pointer to equal to the zero value of an allocated struct.

However, if this continues to bite people, we could consider recovering from a nil panic in Equal and performing the equivalent of if (x == nil || x == nil) { return x == nil && y == nil } on their behalf. However, this will slow down cmp.Equal further and is a hack I do not want to perform unless there is evidence of this being a pervasive problem.

from go-cmp.

empijei avatar empijei commented on August 19, 2024

Hi, sorry to necrobump, but I'd rather not open a duplicate issue.

Just wanted to point out that this problem bit someone today: golang/go#28743

This is probably due to the fact that the (T).Equal(T) method is not really defined, declared or guaranteed to behave like == but people expect it to, and this package does too.

from go-cmp.

m1kola avatar m1kola commented on August 19, 2024

I had this issue with x509.Certificate recently. I guess a workaround while we are waiting for golang/go#28743 is to use a custom cmp.Comparer. Something like this:

certCmp := cmp.Comparer(func(x, y *x509.Certificate) bool {
	if x == nil || y == nil {
		return x == y
	}

	return x.Equal(y)
})

cmp.Diff(something, other, certCmp) // or cmp.Equal

from go-cmp.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.