
在 go 中,固定长度数组仅支持相等性比较(==、!=),不支持直接大小比较;要实现类似 `bytes.compare` 的字典序比较,需将数组转换为切片后调用 `bytes.compare`。
Go 语言规定,固定长度数组(如 [20]byte)是可比较类型,但仅支持 == 和 != 运算符,不支持 = 等关系运算符。因此,当你定义了类似 type Sha1Hash [20]byte 的类型时,无法直接使用 h1 >= h2 进行排序或比较。
解决方法是利用 Go 的切片机制:数组可通过切片语法(如 arr[:] 或 arr[0:n])安全地转为对应长度的切片,且不发生内存拷贝。由于 bytes.Compare 接受 []byte 类型参数,只需将两个 Sha1Hash 值分别切片即可:
import "bytes"
type Sha1Hash [20]byte
func Compare(h1, h2 Sha1Hash) int {
return bytes.Compare(h1[:], h2[:]) // 推荐写法:h1[:] 等价于 h1[0:20]
}✅ 优势说明:
- h1[:] 是最简洁、惯用的写法,语义清晰,明确表示“整个数组对应的切片”;
- bytes.Compare 返回 -1、0 或 1,符合 sort.Interface 所需的 Less 逻辑(例如可用于 sort.Slice 或自定义排序);
- 零分配、零拷贝,性能高效。
⚠️ 注意事项:
- 切片操作 h1[:] 不会复制底层数据,仅生成指向同一底层数组的切片头,完全安全;
- 若后续需支持 sort.Sort,可封装为满足 sort.Interface 的类型,或更简单地使用 sort.Slice:
hashes := []Sha1Hash{h1, h2, h3} sort.Slice(hashes, func(i, j int) bool { return Compare(hashes[i], hashes[j]) < 0 })
总结:对自定义固定长度数组类型进行字典序比较,核心技巧就是「数组 → 切片 → bytes.Compare」。这一模式适用于所有 [N]byte 及其别名类型(如 sha256.Sum256、md5.Sum128 等),是 Go 标准库和生态中的通用实践。










