While recently working on an piece of Go code I found myself wondering: how can you sort by multiple fields? Imagine you have a struct slice and you want to sort it based on multiple fields of the struct.
Here’s an example of a struct representing a simple bank account:
type Account struct {
AccountID int
Balance int
LastUpdated int
Created int
Transactions []int
} And a slice of the Account struct:
var accounts = []Account{} We want to sort the accounts slice by the Balance field and if Balance is the same then by AccountID.
Lets take a simple case first: sort all the accounts by their Balance in decending order:
sort.Slice(accounts, func(i,j int) bool {
return accounts[i].Balance > accounts[j].Balance
}) Here the helper function returns true if the account at index i in the slice has balance greater than account at index j.
Now coming to the actual problem:
sort.Slice(accounts, func(i,j int) bool {
if accounts[i].Balance == accounts[j].Balance {
return accounts[i].AccountID > accounts[j].AccountID
} else {
return accounts[i].Balance > accounts[j].Balance
}
}) Thats it! We start by setting up the helper function in a similar fashion but add an if condition: If the balances are same then sort (descending) by AccountId. But if the balances are not the same then sort it as per previously - by Balance.