Re:Conc: Better Structured Concurrency for Go
by erik_seaberg on Wednesday January 11, 2023 @07:49PM
(#34347487)
x == y can panic if interface values contain incomparable fields in unexported nested structs, how would I check for that? Should we let it become a query of death and bet thousands of peers’ jobs on it never happening?
[ Parent
| on HN ]
Re:Conc: Better Structured Concurrency for Go
by ikiris on Wednesday January 11, 2023 @08:57PM
(#34348064)
don't do that?
this kind of thing is why deepcompare exists to begin with
Re:Conc: Better Structured Concurrency for Go
by aetherane on Wednesday January 11, 2023 @09:42PM
(#34348473)
It seems unrealistic to assume that everyone on a reasonably sized team knows all of the subtle edge cases to avoid and never makes mistakes
Re:Conc: Better Structured Concurrency for Go
by erik_seaberg on Wednesday January 11, 2023 @10:24PM
(#34348785)
I can use reflect.DeepCompare(x, y) and live with false negatives, but maps will always use x == y and blow up for something as simple as adding a private cache or callback to a value.
Re:Conc: Better Structured Concurrency for Go
by erik_seaberg on Wednesday January 11, 2023 @11:21PM
(#34349151)
I can nag everyone to use reflect.DeepEqual and live with some false negatives, but maps always use k1 == k2.
Re:Conc: Better Structured Concurrency for Go
by Groxx on Wednesday January 11, 2023 @11:47PM
(#34349341)
There are also significant performance and behavior differences between the two.
They are not inter-changeable, nor can one replace the other.
Re:Conc: Better Structured Concurrency for Go
by ikiris on Thursday January 12, 2023 @02:45AM
(#34350401)
more specifically, it's really strange to hear of people doing equivalence checks on objects with structure. What are you expecting that comparison to do? I doubt it is doing what you think is happening, and is indeed risky of panics.
Re:Conc: Better Structured Concurrency for Go
by mappu on Monday January 23, 2023 @01:11AM
(#34486042)
This is days later, sorry, but - you can't use an interface as a map key, so this shouldn't apply, right?
Re:Conc: Better Structured Concurrency for Go
by erik_seaberg on Thursday January 26, 2023 @11:02PM
(#34542303)
https://go.dev/ref/spec#Map_types says that is allowed.
> If the key type is an interface type, these comparison operators must be defined for the dynamic key values; failure will cause a run-time panic.
Re:Conc: Better Structured Concurrency for Go
by mappu on Wednesday January 11, 2023 @09:24PM
(#34348338)
Is this really the case? Can you link to anything or an example on go.dev/play/ ?
I can find a mention of "cmp.Equal" having that behavior, but that's just a third-party package panic.
Re:Conc: Better Structured Concurrency for Go
by assbuttbuttass on Wednesday January 11, 2023 @09:59PM
(#34348598)
It's true, but you'd never really write code like this
Re:Conc: Better Structured Concurrency for Go
by erik_seaberg on Wednesday January 11, 2023 @10:43PM
(#34348915)
The problem also affects structs that happen to have a private callback or cache anywhere within.
Re:Conc: Better Structured Concurrency for Go
by preseinger on Thursday January 12, 2023 @06:30PM
(#34361781)
Obviously `interface{}` values are not comparable?
Re:Conc: Better Structured Concurrency for Go
by erik_seaberg on Thursday January 12, 2023 @08:48PM
(#34362953)
The comparison is explicitly allowed in the language spec, there’s no warning for doing it, and it often works depending on the types. It’s a data-dependent runtime error, which is usually hard to guarantee test coverage for.
Re:Conc: Better Structured Concurrency for Go
by preseinger on Thursday January 12, 2023 @06:30PM
(#34361767)
Link to an example? I don't think this is true, unless you're playing stupid games with your code, which wouldn't pass code review.