0

0

如何在 Go 中比较自定义的固定长度数组类型(如 Sha1Hash)

心靈之曲

心靈之曲

发布时间:2026-01-01 13:32:02

|

446人浏览过

|

来源于php中文网

原创

如何在 Go 中比较自定义的固定长度数组类型(如 Sha1Hash)

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

✅ 优势说明:

XPaper Ai
XPaper Ai

AI撰写论文、开题报告生成、AI论文生成器尽在XPaper Ai论文写作辅助指导平台

下载
  • 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 标准库和生态中的通用实践。

相关专题

更多
Sass和less的区别
Sass和less的区别

Sass和less的区别有语法差异、变量和混合器的定义方式、导入方式、运算符的支持、扩展性等。本专题为大家提供Sass和less相关的文章、下载、课程内容,供大家免费下载体验。

197

2023.10.12

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1435

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

224

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

85

2025.10.17

sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

379

2023.09.04

go中interface用法
go中interface用法

本专题整合了go语言中int相关内容,阅读专题下面的文章了解更多详细内容。

76

2025.09.10

go语言 数组和切片
go语言 数组和切片

本专题整合了go语言数组和切片的区别与含义,阅读专题下面的文章了解更多详细内容。

45

2025.09.03

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

65

2025.12.31

php网站源码教程大全
php网站源码教程大全

本专题整合了php网站源码相关教程,阅读专题下面的文章了解更多详细内容。

44

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 3.2万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号