複数条件でのsort.Sliceの書き方工夫


Goで↓みたいな並び替えをしたい場合。

xxxで 降順、同じならyyyで降順、それも同じならzzzで降順。

素朴に書くとless関数がこんな感じになるんだけど…

if a.xxx < b.xxx {
  return true
}

if a.xxx > b.xxx {
  return false
}

if a.yyy < b.yyy {
  return true
}

if a.yyy > b.yyy {
  return false
}

return a.zzz < b.zzz

switch文で組み立てると{}がなくなるので少しマシになるみたい。

package main

import (
    "fmt"
    "sort"
)

type person struct {
    firstName string
    lastName  string
    age       int
}

func main() {
    people := []person{
        {"taro", "tanaka", 20},
        {"hanako", "suzuki", 21},
        {"taro", "sato", 22},
        {"taro", "sato", 21},
    }
    fmt.Println(people)
    sort.Slice(people, func(i, j int) bool {
        a, b := people[i], people[j]
        switch {
        case a.firstName < b.firstName:
            return true
        case a.firstName > b.firstName:
            return false
        case a.lastName < b.lastName:
            return true
        case a.lastName > b.lastName:
            return false
        default:
            return a.age < b.age
        }
    })
    fmt.Println(people)
}

しかし、もう少し短くできないだろうか。。