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]]
}

请根据你的实际数据结构选择对应的排序方式。

回到顶部