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
Run Code Online (Sandbox Code Playgroud)
上面的代码没有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]
})
Run Code Online (Sandbox Code Playgroud)
如果您在索引原始切片时手动添加偏移量,它也适用:
sort.Slice(abc[1:], func(i, j int) bool {
return abc[1+i] < abc[1+j]
})
Run Code Online (Sandbox Code Playgroud)
当然,存储这个切片会更好、更干净、更高效:
s := abc[1:]
sort.Slice(s, func(i, j int) bool {
return s[i] < s[j]
})
Run Code Online (Sandbox Code Playgroud)
尝试Go Playground上的示例。