sort.Slice 排序不正确

Neo*_* Li 0 sorting go slice

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正确排序。为什么?

icz*_*cza 5

因为您传递了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上的示例。