go 1.21:cmp
标准库 cmp
原文在这里
go 1.21 新增 cmp
包提供了与有序变脸比较相关的类型和函数。
Ordered
定义如下:
type Ordered interface { ~int | ~int8 | ~int16 | ~int32 | ~int64 | ~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr | ~float32 | ~float64 | ~string }
Ordered
是一个约束,它允许任何有序类型:任何支持 <
、<=
、>=
、>
运算符的类型。如果 Go 的未来版本添加了新的有序类型,这个约束将被修改以包含它们。
请注意,浮点类型可能包含 NaN
("非数字")值。当使用如 ==
或 <
的运算符比较 NaN 值和任何其他值(无论是否为 NaN
)时,总是会返回 false
。请参阅 Compare
函数,以获取一种一致的方式来比较 NaN
值。
Compare
函数定义如下:
func Compare[T Ordered](x, y T) int
Compare
返回值如下:
- -1, 小于
- 0, 与 相等
- 1, 大于
对于浮点类型,NaN
小于任何非NaN
,-0.0
等于0.0
。
Less
函数定义如下:
func Less[T Ordered](x, y T) bool
Less
返回x
是否小于y
。对于浮点类型,NaN
小于任何非NaN
,-0.0
等于0.0
。
github.com/google/go-cmp/cmp
github.com/google/go-cmp/cmp
是一个 Go 语言中用于比较任意两个值是否相等的库。它提供了灵活的比较选项,能够处理复杂的数据结构,是 Go 生态系统中用于编写测试代码或其他需要比较值的场景的强大工具。
以下是对 github.com/google/go-cmp/cmp
的详细介绍:
安装
你可以使用 Go Modules 进行安装,无需额外的安装步骤:
go get github.com/google/go-cmp/cmp
主要特点
github.com/google/go-cmp/cmp
具有以下主要特点:
-
深度比较:
cmp
可以比较复杂的数据结构,包括嵌套的结构体、切片、映射等。它会递归地比较结构体的字段,确保所有的值都相等。 -
自定义比较选项:你可以使用
cmp.Options
结构来自定义比较的行为。这包括忽略特定字段、指定自定义比较函数、配置忽略类型的选项等。这使得你可以精确控制比较的方式。 -
友好的错误报告:当比较失败时,
cmp
生成清晰和有用的错误报告,帮助你理解为什么两个值不相等。这有助于快速识别和修复问题。 -
支持自定义比较函数:你可以编写自定义比较函数,以处理特定类型的值的比较。这允许你在比较复杂的数据结构时定义自己的比较逻辑。
使用示例
以下是一个使用 github.com/google/go-cmp/cmp
进行比较的示例:
package main import ( "fmt" "github.com/google/go-cmp/cmp" ) type Person struct { Name string Age int } func main() { // 创建两个 Person 结构体实例 person1 := Person{Name: "Alice", Age: 30} person2 := Person{Name: "Bob", Age: 25} // 使用 cmp.Equal 检查两个结构体是否相等 equal := cmp.Equal(person1, person2) if equal { fmt.Println("The two people are equal.") } else { fmt.Println("The two people are not equal.") } }
在此示例中,我们导入了 github.com/google/go-cmp/cmp
包,并使用 cmp.Equal
函数比较了两个 Person
结构体实例。由于它们的字段不同,所以 equal
变量的值为 false
。
更高级的用法
除了基本的比较功能,github.com/google/go-cmp/cmp
还支持更高级的用法,包括自定义比较选项和自定义比较函数。以下是一些示例:
使用自定义比较选项
opts := cmp.Options{ cmp.IgnoreFields(Person{}, "Age"), // 忽略 Person 结构体的 Age 字段 } equal := cmp.Equal(person1, person2, opts)
使用自定义比较函数
type MyType struct { Value int } // 自定义比较函数,当 Value 为偶数时认为相等 func customComparator(x, y MyType) bool { return x.Value%2 == 0 && y.Value%2 == 0 } opts := cmp.Options{ cmp.Comparer(customComparator), } equal := cmp.Equal(MyType{Value: 2}, MyType{Value: 4}, opts) // true

声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
Author: mengbin
blog: mengbin
Github: mengbin92
cnblogs: 恋水无意
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程