Golang中如何对字节数组进行排序
Golang中如何对字节数组进行排序 如何对 *[]Byte 进行排序?
我尝试使用以下函数,但效果不佳。
sort.Slice(src, func(i, j int) bool { return bytes.Compare((*src)[i], (*src)[j]) < 0 })
遇到此错误:cannot use (*src)[i] (variable of type byte) as []byte value in argument to bytes.Comparecompiler
有什么建议吗?
2 回复
bytes.Compare 函数的签名是:
func Compare(a, b []byte) int
所以它并不是比较单个字节,而是比较字节切片。
在你的 less 函数中,不要使用它,直接比较字节值即可:
sort.Slice(src, func(i, j int) bool { return (*src)[i] < (*src)[j]) })
更多关于Golang中如何对字节数组进行排序的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
你遇到的问题是因为 *[]byte 实际上是指向字节切片的指针,而 (*src)[i] 获取的是单个 byte 类型,不是 []byte 切片。bytes.Compare 需要两个 []byte 参数,因此会报类型错误。
如果你想要对整个字节切片进行排序(即按字节值排序),应该直接对切片本身排序,而不是对指针解引用后的元素排序。以下是正确的做法:
package main
import (
"fmt"
"sort"
)
func main() {
data := []byte{3, 1, 4, 1, 5, 9, 2, 6}
src := &data // src 是 *[]byte
// 对切片进行排序
sort.Slice(*src, func(i, j int) bool {
return (*src)[i] < (*src)[j]
})
fmt.Println(*src) // 输出: [1 1 2 3 4 5 6 9]
}
如果你的 *[]byte 实际上是指向 []byte 切片的指针,但每个元素本身是 byte,那么直接比较字节值即可,不需要使用 bytes.Compare。
如果你原本希望排序的是 [][]byte(即每个元素是一个字节切片),那么应该这样写:
package main
import (
"bytes"
"fmt"
"sort"
)
func main() {
data := [][]byte{{3, 2}, {1, 5}, {4, 1}}
src := &data // src 是 *[][]byte
sort.Slice(*src, func(i, j int) bool {
return bytes.Compare((*src)[i], (*src)[j]) < 0
})
fmt.Println(*src) // 输出: [[1 5] [3 2] [4 1]]
}
请根据你的实际数据结构选择对应的排序方式。

