Go

Go 排序:slices.SortFunc 返回的不是 bool

包名是 slices(复数)。比较函数返回负数、0、正数,用 cmp.Compare 最省事:

go
slices.SortFunc(ps, func(a, b Person) int {
	return cmp.Compare(a.Age, b.Age)
})

// 多个字段:先按年龄,再按名字(cmp.Or 取第一个非 0 的结果)
slices.SortFunc(ps, func(a, b Person) int {
	return cmp.Or(cmp.Compare(a.Age, b.Age), cmp.Compare(a.Name, b.Name))
})

排序是原地的,没有返回值。想保留原顺序,先克隆:

go
c := slices.Clone(s)
slices.Sort(c)

b := a 不行:它只复制了切片头(指针、长度、容量),底层数组还是同一个,排 b 就等于排 a。

数组要先 arr[:] 变成切片再排。

esc