【发布时间】:2020-05-21 05:51:33
【问题描述】:
abc := []byte{'a', 'c', 'b'}
sort.Slice(abc[1:], func(i, j int) bool {
return abc[i] < abc[j]
})
fmt.Println(string(abc)) //print acb
上面的代码没有正确排序abc。为什么?
【问题讨论】:
abc := []byte{'a', 'c', 'b'}
sort.Slice(abc[1:], func(i, j int) bool {
return abc[i] < abc[j]
})
fmt.Println(string(abc)) //print acb
上面的代码没有正确排序abc。为什么?
【问题讨论】:
因为您将abc[1:] 子切片传递给排序,但在您的less() 函数中您索引abc 原始(完整)切片。 sort.Slice() 将根据您传递给它的切片将索引值传递给less() 进行排序,并在另一个切片(原始)上使用这些索引,您将比较意外元素并向sort.Slice() 报告错误信息。
如果你使用相同的切片,它可以工作:
sort.Slice(abc[1:], func(i, j int) bool {
return abc[1:][i] < abc[1:][j]
})
如果您在索引原始切片时手动添加偏移量,它也可以工作:
sort.Slice(abc[1:], func(i, j int) bool {
return abc[1+i] < abc[1+j]
})
当然存储这个切片会更好、更干净、更高效:
s := abc[1:]
sort.Slice(s, func(i, j int) bool {
return s[i] < s[j]
})
尝试Go Playground 上的示例。
【讨论】: