News for hackers. Stuff that matters.
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?
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

https://go.dev/play/p/r9NkQb6bQTx

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.