sort.Slice 的第二个参数,如果使用了和第一个参数没关系的变量,为什么就失效了。自己眼拙,从源码里没看出什么玄机
代码:
package main
import (
"log"
"math"
"sort"
)
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]
1
sujin190 2022-08-30 11:32:12 +08:00
sort 过程中并没有创建新 slice ,那么说明排序过程会交换变量位置,你这个第二个排序过程中 c 和 d 两个 slice 中相同索引位置已经不是最开始相同元素了啊,排序结果当然是不对的,这个很明显的吧
|