Sort by multiple keys in Golang
Problem:
We have a list of users:
type User struct {
Name string
Valid bool
Age int
}
listUsers := []User{
{
Name: "A",
Valid: false,
Age: 12,
},
{
Name: "B",
Valid: true,
Age: 11,
},
{
Name: "C",
Valid: true,
Age: 10,
},
{
Name: "D",
Valid: false,
Age: 13,
},
}
We want to sort by Valid first, then Age in descending order.
The solution should be B C D A.
Wrong solution:
sort.Slice(listUsers, func(i, j int) bool {
if listUsers[i].Valid && !listUsers[j].Valid {
return true
}
return listUsers[i].Age > listUsers[j].Age
})
This solution returns D B C A.
Right solution:
sort.Slice(listUsers, func(i, j int) bool {
if listUsers[i].Valid != listUsers[j].Valid {
return listUsers[i].Valid && !listUsers[j].Valid
}
return listUsers[i].Age > listUsers[j].Age
})
This solution returns B C D A. As expected.
How so?
The wrong one forgot the case when listUsers[i].Valid is false and
listUsers[j].Valid is true. It should return false in that case
instead of fallback to Age comparision.