4 ms·
They have sort.SliceStable for this I think, it's not much more verbose and is arguably clearer and more flexible as you can define exactly how the keys are com
by grey-area 10y ago
They have sort.SliceStable for this I think, it's not much more verbose and is arguably clearer and more flexible as you can define exactly how the keys are compared (for example perhaps you want to downcase names before compare).
Compare the old way to do a multi-key sort:
https://play.golang.org/p/NJTVoeQkMt https://play.golang.org/p/NJTVoeQkMt
With the new way:
https://play.golang.org/p/6ReQxHT1lR https://play.golang.org/p/6ReQxHT1lR
it's a lot simpler and clearer and doesn't require a special slice type (as it did before), but lets you sort on multiple keys if you need to. Presumably sort.SliceStable is a bit slower and that's why they have a separate sort.Slice.
Note though that the old way using slice types does let you do something neater at the point of use at the cost of more setup:
OrderedBy(language, increasingLines, user).Sort(changes)
which in some ways is more similar to what you desired?
Seeing this sort of hack added does make me think containers are the one big weak point in Go at present, they are a bit ugly, and special cases abound (append,delete,range,sort) - maybe in Go2 they could have something neater, more generic and more extensible. My hopes for Go 2 as a really uninformed language noob are a tidy up of the stdlib, variants and more elegant ways to manipulate containers (I won't say generics!), I would love to see things like magic comments and struct tags disappear too but that'll never happen. I'm pretty happy with the language otherwise, and would actually like to see Go get smaller and simpler over time.
- justinsaccount 10y agoah, SliceStable does make it a little easier at least. I'd say you could just wrap that in a function, but you can't easily do that. Sorting is probably the one area where I really miss generics in go.. because comparing and sorting IS such a generic thing to do. In my head I think, "Oh, so I just want to do hosts.sort(key=operator.attrgetter("os", "version", "address")) and then proceed to write the 20 lines of code that lets me do that :-(
- grey-area 10y agoJust thought of one more way to do this which is neater - define functions on a simpler slice type: https://play.golang.org/p/0YcxA-Ufs- https://play.golang.org/p/0YcxA-Ufs- So your sorting becomes quite neat: sort.SliceStable(changes,changes.byLines) sort.SliceStable(changes,changes.byUser) I think I might use it this way (haven't actually used this in a real app yet).
- SaidinWoT 10y agoPerhaps something combining all of the things you've made use of? https://play.golang.org/p/8RDqjjZDB8 https://play.golang.org/p/8RDqjjZDB8