参考: https://future-architect.github.io/articles/20230816a/
この方法だと、重複排除するには事前にソートしないとダメらしい
例)
SQLでいう
select distinct *
order by classNumber, name, age
をgoの構造体のスライスで、やる。
package main
import (
"cmp"
"fmt"
"slices"
)
type user struct {
classNumber uint8
name string
age uint8
}
func main() {
users := []user{
{classNumber: 2, name: "hanako", age: 12},
{classNumber: 3, name: "jiro", age: 32},
{classNumber: 2, name: "hanako", age: 12},
{classNumber: 1, name: "taro", age: 22},
{classNumber: 2, name: "yuki", age: 13},
}
slices.SortFunc(users, func(a, b user) int {
c := cmp.Compare(a.classNumber, b.classNumber)
if c == 0 {
c = cmp.Compare(a.name, b.name)
if c == 0 {
c = cmp.Compare(a.age, b.age)
}
}
return c
})
fmt.Println(users)
sortedUniqueUsers := slices.CompactFunc(users, func(a, b user) bool {
return reflect.DeepEqual(a, b)
})
fmt.Println(sortedUniqueUsers)
}
結果出力
[{1 taro 22} {2 hanako 12} {2 hanako 12} {2 yuki 13} {3 jiro 32}] # いったんソート
[{1 taro 22} {2 hanako 12} {2 yuki 13} {3 jiro 32}] # 重複排除
Program exited.