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上尝试这些示例。