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,\(x\) 小于 \(y\)
- 0,\(x\) 与 \(y\) 相等
- 1,\(x\) 大于 \(y\)
对于浮点类型,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: 恋水无意
go 1.21:cmp的更多相关文章
- Ext.Net学习笔记21:Ext.Net FormPanel 字段验证(validation)
Ext.Net学习笔记21:Ext.Net FormPanel 字段验证(validation) 作为表单,字段验证当然是不能少的,今天我们来一起看看Ext.Net FormPanel的字段验证功能. ...
- 项目总结21:项目总结21:input实现多图上传(FormData)(上传OSS并保存数据库)
项目总结21:input实现多图上传(FormData)(上传OSS并保存数据库) 备注:本案例,作为Demo,包含少量的项目业务逻辑,input多图上传的逻辑是完整的: 不废话直接上代码 1-前端标 ...
- Effective STL 学习笔记 Item 21:Comparison Function 相关
Effective STL 学习笔记 Item 21:Comparison Function 相关 */--> div.org-src-container { font-size: 85%; f ...
- 21:包含min函数的栈
import java.util.Stack; /** * 面试题21:包含min函数的栈 * 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. */ public class ...
- 搞懂分布式技术21:浅谈分布式消息技术 Kafka
搞懂分布式技术21:浅谈分布式消息技术 Kafka 浅谈分布式消息技术 Kafka 本文主要介绍了这几部分内容: 1基本介绍和架构概览 2kafka事务传输的特点 3kafka的消息存储格式:topi ...
- 编写高质量代码改善C#程序的157个建议——建议21:选择正确的集合
建议21:选择正确的集合 要选择正确的集合,首先要了解一些数据结构的知识.所谓数据结构,就是相互之间存在一种或多种特定关系的数据元素的集合. 集合的分类参考下图: 由于非泛型集合存在效率低及非类型安全 ...
- Wannafly挑战赛21:C - 大水题
链接:Wannafly挑战赛21:C - 大水题 题意: 现在给你N个正整数ai,每个数给出一“好数程度” gi(数值相同但位置不同的数之间可能有不同的好数程度).对于在 i 位置的数,如果有一在j位 ...
- 任务20:DI初始化的源码解读 & 任务21:依赖注入的使用
20 我们来看一下asp.net core中依赖注入的源码 https://github.com/aspnet/AspNetCore/tree/master/src/Hosting 任务21:依赖注入 ...
- Asp.NetCore源码学习[2-1]:日志
Asp.NetCore源码学习[2-1]:日志 在一个系统中,日志是不可或缺的部分.对于.net而言有许多成熟的日志框架,包括Log4Net.NLog.Serilog 等等.你可以在系统中直接使用这些 ...
- paper 21 :Libsvm的安装和使用
看了很多资料(包括我们实验室群里师兄上传的资料),算是掌握了libsvm的正确安装和使用,把结果告诉大家以方便以后使用. 1. 参考网站: libsvm库下载:http://www.csie.ntu. ...
随机推荐
- 以平安银行“智能化银行3.0”实践,看火山引擎DataTester如何助推金融行业数智化进程
作者:DataTester 银行业正在进入一场围绕客户为中心的新革命时期.流量红利逐渐消失,银行零售进入存量客户精细化经营时代:"互联网+"给金融带来更多的场景,智能化成为零售 ...
- ABAP 内表与JSON转换
一.内表转JSON "-----------------------------@斌将军----------------------------- TYPES: BEGIN OF ty_na ...
- WPF ElementHost 内存泄露问题
无意中发现,WPF ElementHost 控件如果未正确释放,会存在内存泄露问题.解决方法如下: xaml代码: <Grid x:Name="grid"> <W ...
- JSP | IDEA 配置 JSP 模板
新建 jsp 文件时的模板 在第 5 步输入下面模板代码: <%-- Created by IntelliJ IDEA. User: ${USER} Date: ${DATE} Time: ${ ...
- 【数据库】E-R图向关系模型转换的规则
E-R图向关系模型转换的规则: (1) 一个实体型转换为一个关系模式,实体的属性就是关系的属性,实体的码(关键字)就是关系的码. (2) 一个 1:1 联系可以转换为一个独立的关系模式,也可以与任意一 ...
- AtCoder Beginner Contest 178 个人题解(C组合问题 + 快速幂,D规律,E数学公式变形)
补题链接:Here A - Not Editorial 给出 \(x = 1\) 则输出 0:给出 \(x = 0\) 则输出 1 利用 x ^ 1 可以快速实现 \(x\) 的转换 B - Prod ...
- Kafka 社区KIP-405中文译文(分层存储)
原文链接:https://cwiki.apache.org/confluence/display/KAFKA/KIP-405%3A+Kafka+Tiered+Storage 译者:Kafka KIP- ...
- 3 分钟将免费无限制的 Claude 2.0 接入任意 GPT 套壳应用,太香了!
Claude 是 ChatGPT 的最强竞争对手,由 OpenAI 早期团队成员创建,目标就是打造出能 赶超 ChatGPT 的 AI.最新版的 Claude 2.0,能力已经开始领先 ChatGPT ...
- linux route 命令
route 管理路由表 要实现两个不同的子网之间的通信,需要一台连接两个网络的路由器,或者同时位于两个网络的网关来实现.在Linux系统中,设置路由通常是为了解决以下问题:该Linux ...
- Java - 获取个十百千位数
int n= 1234: System.out.println(n%10 ); //获取个位 System.out.println((n/10)%10 ); //获取十位 System.out.pri ...