Two significant issues that need to be thought about: - When slices can be compared, they can be used as map keys. What happens if the contents of a slice are changed after it has been added to a map?
- It is possible to have self-referential slices [1]. How would comparison work in such a case? [1] https://play.golang.org/p/lTqhKjD842K On 30 Jan 2018 16:45, <matthewju...@gmail.com> wrote: > Here’s a draft for a Go 2 proposal that I’d like to add to the issue > tracker since there’s no discussion there about this: > > Slices should have equality defined. > > https://golang.org/doc/faq#map_keys > > Map lookup requires an equality operator, which slices do not implement. >> They don't implement equality because equality is not well defined on such >> types; there are multiple considerations involving shallow vs. deep >> comparison, pointer vs. value comparison, how to deal with recursive types, >> and so on. > > > This proposal allows slices to be used as map keys and for comparison with > == and !=. > > https://golang.org/ref/spec#Comparison_operators > > Slice, map, and function values are not comparable. > > > An initial proposal is that slices are compared by nil versus non-nil, > length and backing array pointer, and then by the rules for array if length > is equal but different arrays are pointed: > > Array values are comparable if values of the array element type are >> comparable. Two array values are equal if their corresponding elements are >> equal. > > > reflect.DeepEqual defines a similar slice equality except “deeply equal” > defines additional criteria: https://golang.org/pkg/reflect/#DeepEqual > > Slice values are deeply equal when all of the following are true: they are >> both nil or both non-nil, they have the same length, and either they point >> to the same initial entry of the same underlying array (that is, &x[0] == >> &y[0]) or their corresponding elements (up to length) are deeply equal. >> Note that a non-nil empty slice and a nil slice (for example, []byte{} and >> []byte(nil)) are not deeply equal. > > > A use case for me was a map keyed by varying length paths where the map > was not shared between different path generating computations. With this > proposal such a type could have shared generated paths as keys. > > Ian suggests in a [this] golang-nuts thread that there are varying use > cases: > > The problem is that different programs need different things for slice >> equality. Some want pointer equality as you suggest. Some want element >> comparisons, as is done for array equality. Without an obvious semantics >> for the operation, the language omits it entirely. >> > > But I don’t know where slice pointer equality would be useful. I'm also > not clear on the recursive type problem. > > Matt > > On Monday, July 4, 2016 at 2:29:18 AM UTC-5, Chad wrote: >> >> I realize that the issue might be about changing/ adding a builtin: >> >> - either add a builtin deep value Comparison function (via reflection) >> - or add a snapshot type refinement which triggers the allocation of >> an immutable copy of a reference type >> (and we would recover the behaviour of the string implementation >> which is a special case of []byte snapshot, i.e. a value type*) >> >> I would still expect the behaviour previously mentioned for the "==" >> operator. >> >> (*) I keep using reference/value type terminology but it is indeed >> slightly tricky. But for lack of a better one... >> > -- > You received this message because you are subscribed to the Google Groups > "golang-nuts" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to golang-nuts+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.