Comments (9)
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.
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.
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.
from go-cmp.
from go-cmp.
from go-cmp.
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.
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.
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)
- Diff is extremely slow HOT 3
- How to ignore specific field by name? HOT 1
- Ideas for a v2 HOT 3
- Default support for the `netip` package HOT 1
- New minor release of the library? HOT 4
- cmp.Diff() switching from property diffs to "new object" diff when object changes significantly HOT 1
- Inconsistent whitespace produced by cmp.Diff HOT 2
- cmpopts: add EquateUnsetFields(want) or FilterFieldsFrom(want) HOT 1
- IgnoreFields and nested struct HOT 2
- Enable a dependency update tool HOT 2
- Package Name Mismatches HOT 4
- unhelpful output for difference in slices HOT 1
- How to implement jests.js's `expect.any(String)` like functionality? HOT 1
- cmpopts.IgnoreFields does not work on structs with an Equal method HOT 1
- Performance Issue Comparing Array Types HOT 1
- Naming clash for new cmp standard package HOT 4
- Comparing two fields with diffirent types that are semantically equivalent HOT 3
- String diff for UUIDs can use strings.Join syntax which makes it more confusing HOT 4
- Reporter truncating important context on diff output but leaving others alone
- How to add more context to Diff output?
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from go-cmp.