sort.Slice 的第二个参数,如果使用了和第一个参数没关系的变量,对第一个参数的排序并不按预期来。不像lodash的sortBy。
因为快排过程中,第一个参数的元素位置会变动。
func main() {
// 排序正常操作
c := []float64{1308.24, 1912.5900000000001, 0, 5164.84, 6375.8, 6032.639999999999, 5794.66, 190.79, 4472.87, 5290.28, 185.26, 459.59, 139.39, 95.39}
sort.Slice(c, func(i, j int) bool { return c[i] > c[j] })
log.Println("sorted c by float:", c)
// less函数中使用外部变量, 排序有问题
var d = make([]int, len(c))
for idx, item := range c {
d[idx] = int(math.Round(item))
}
sort.Slice(c, func(i, j int) bool { return d[i] > d[j] })
log.Println("sorted c by int:", c)
}对应输出
2022/08/30 11:07:12 sorted c by float: [6375.8 6032.639999999999 5794.66 5290.28 5164.84 4472.87 1912.5900000000001 1308.24 459.59 190.79 185.26 139.39 95.39 0]
2022/08/30 11:07:12 sorted c by int: [1308.24 6375.8 5794.66 5290.28 5164.84 4472.87 1912.5900000000001 6032.639999999999 459.59 190.79 185.26 139.39 95.39 0]