Closed3

ULIDのソートの仕方 (Go言語)

PenPenPenPen

26文字の文字列としてエンコードされたULID(string)をどのようにソートするか調査する

PenPenPenPen

これを応用する

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)
}
PenPenPenPen
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にクローズされました