Closed3
ULIDのソートの仕方 (Go言語)
26文字の文字列としてエンコードされたULID(string)をどのようにソートするか調査する
これを応用する
type person struct {
Name string
Age int
Dob string
}
func main() {
persons := []person{
person{"Alice", 21, "12-Feb-2001"},
person{"Bob", 36, "06-Aug-1985"},
person{"Debora", 26, "30-Dec-1995"},
person{"Charles", 19, "02-Jan-2002"},
}
// 若い順にソートする
sort.SliceStable(persons, func(i, j int) bool {
return persons[i].Age < persons[j].Age
})
fmt.Println("sorted persons", persons)
}
type id struct {
ID int
ULID ulid.ULID
}
func main() {
// ULIDの入ったリストを作成
list := make([]id, 5)
for i := range list {
entropy := rand.New(rand.NewSource(time.Now().UnixNano()))
ms := ulid.Timestamp(time.Now())
ULID, err := ulid.New(ms, entropy)
if err != nil {
fmt.Println("failed to create ULID")
}
list[i].ID = i
list[i].ULID = ULID
time.Sleep(1 * time.Second)
}
fmt.Println("before sorting: ", list)
// 最新順にsortする(= order by id desc)
sort.SliceStable(list, func(i, j int) bool {
num := list[i].ULID.Compare(list[j].ULID)
if num == 1 {
return true
}
return false
})
fmt.Println("after sorting: ", list)
}
before sorting: [{0 01GC8RETXRPSQ4EHAT301KX0WJ} {1 01GC8REVX183SZMV6RYZMN2TFE} {2 01GC8REWWAXG36JVZFX6D0FJ73} {3 01GC8REXVKQ27RKHBHWBNNCR6X} {4 01GC8REYTVKNBTXK5NP1MMN40A}]
after sorting: [{4 01GC8REYTVKNBTXK5NP1MMN40A} {3 01GC8REXVKQ27RKHBHWBNNCR6X} {2 01GC8REWWAXG36JVZFX6D0FJ73} {1 01GC8REVX183SZMV6RYZMN2TFE} {0 01GC8RETXRPSQ4EHAT301KX0WJ}]
このスクラップは2022/09/19にクローズされました