index
Sometimes we'll want to sort a collection by something other than its natural order. For example, suppose we wanted to sort strings by their length instead of alphabetically. Here's an example of custom sorts in Go.
package main
import (
	"fmt"
	"sort"
)
In order to sort by a custom function in Go, we need a corresponding type. Here we've created a `byLength` type that is just an alias for the builtin `[]string` type.
type byLength []string
We implement `sort.Interface` - `Len`, `Less`, and `Swap` - on our type so we can use the `sort` package's generic `Sort` function. `Len` and `Swap` will usually be similar across types and `Less` will hold the actual custom sorting logic. In our case we want to sort in order of increasing string length, so we use `len(s[i])` and `len(s[j])` here.
func (s byLength) Len() int {
	return len(s)
}
func (s byLength) Swap(i, j int) {
	s[i], s[j] = s[j], s[i]
}
func (s byLength) Less(i, j int) bool {
	return len(s[i]) < len(s[j])
}
With all of this in place, we can now implement our custom sort by converting the original `fruits` slice to `byLength`, and then use `sort.Sort` on that typed slice.
func main() {
	fruits := []string{"peach", "banana", "kiwi"}
	sort.Sort(byLength(fruits))
	fmt.Println(fruits)
[kiwi peach banana]
}
index