标准库 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 具有以下主要特点:

  1. 深度比较cmp 可以比较复杂的数据结构,包括嵌套的结构体、切片、映射等。它会递归地比较结构体的字段,确保所有的值都相等。

  2. 自定义比较选项:你可以使用 cmp.Options 结构来自定义比较的行为。这包括忽略特定字段、指定自定义比较函数、配置忽略类型的选项等。这使得你可以精确控制比较的方式。

  3. 友好的错误报告:当比较失败时,cmp 生成清晰和有用的错误报告,帮助你理解为什么两个值不相等。这有助于快速识别和修复问题。

  4. 支持自定义比较函数:你可以编写自定义比较函数,以处理特定类型的值的比较。这允许你在比较复杂的数据结构时定义自己的比较逻辑。

使用示例

以下是一个使用 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的更多相关文章

  1. Ext.Net学习笔记21:Ext.Net FormPanel 字段验证(validation)

    Ext.Net学习笔记21:Ext.Net FormPanel 字段验证(validation) 作为表单,字段验证当然是不能少的,今天我们来一起看看Ext.Net FormPanel的字段验证功能. ...

  2. 项目总结21:项目总结21:input实现多图上传(FormData)(上传OSS并保存数据库)

    项目总结21:input实现多图上传(FormData)(上传OSS并保存数据库) 备注:本案例,作为Demo,包含少量的项目业务逻辑,input多图上传的逻辑是完整的: 不废话直接上代码 1-前端标 ...

  3. Effective STL 学习笔记 Item 21:Comparison Function 相关

    Effective STL 学习笔记 Item 21:Comparison Function 相关 */--> div.org-src-container { font-size: 85%; f ...

  4. 21:包含min函数的栈

    import java.util.Stack; /** * 面试题21:包含min函数的栈 * 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. */ public class ...

  5. 搞懂分布式技术21:浅谈分布式消息技术 Kafka

    搞懂分布式技术21:浅谈分布式消息技术 Kafka 浅谈分布式消息技术 Kafka 本文主要介绍了这几部分内容: 1基本介绍和架构概览 2kafka事务传输的特点 3kafka的消息存储格式:topi ...

  6. 编写高质量代码改善C#程序的157个建议——建议21:选择正确的集合

    建议21:选择正确的集合 要选择正确的集合,首先要了解一些数据结构的知识.所谓数据结构,就是相互之间存在一种或多种特定关系的数据元素的集合. 集合的分类参考下图: 由于非泛型集合存在效率低及非类型安全 ...

  7. Wannafly挑战赛21:C - 大水题

    链接:Wannafly挑战赛21:C - 大水题 题意: 现在给你N个正整数ai,每个数给出一“好数程度” gi(数值相同但位置不同的数之间可能有不同的好数程度).对于在 i 位置的数,如果有一在j位 ...

  8. 任务20:DI初始化的源码解读 & 任务21:依赖注入的使用

    20 我们来看一下asp.net core中依赖注入的源码 https://github.com/aspnet/AspNetCore/tree/master/src/Hosting 任务21:依赖注入 ...

  9. Asp.NetCore源码学习[2-1]:日志

    Asp.NetCore源码学习[2-1]:日志 在一个系统中,日志是不可或缺的部分.对于.net而言有许多成熟的日志框架,包括Log4Net.NLog.Serilog 等等.你可以在系统中直接使用这些 ...

  10. paper 21 :Libsvm的安装和使用

    看了很多资料(包括我们实验室群里师兄上传的资料),算是掌握了libsvm的正确安装和使用,把结果告诉大家以方便以后使用. 1. 参考网站: libsvm库下载:http://www.csie.ntu. ...

随机推荐

  1. Solon2 接口开发: 了解 LoadBalance

    上一文的代码 HttpUtils.http(sevName, ctx.path()) (来自 "solon.cloud.httputils" 插件的工具类),内部是通过 sevNa ...

  2. 设置MySQL 创建数据库,默认为UTF-8

    Windows 安装 MySQL 5.7 x64 位 MySQL 8.0及以上默认为utf8,所以不需要设置 mysql> show variables like 'character_%' m ...

  3. 【Django drf】序列化器总结

    目录 序列化器字段 外键字段自定义序列化 在模型类中写方法 在序列化类中写方法 反序列化 外键字段反序列化保存 ModelSerializer使用总结 序列化器字段 序列化中的字段可以根据用途分为三种 ...

  4. 【辅助工具】Apifox

    注意事项 需要刷新权限 请求方式需要对应

  5. JSP 简单入门与 IDEA 开发环境配置

    原作者为 RioTian@cnblogs, 本作品采用 CC 4.0 BY 进行许可,转载请注明出处. 在学 Java 连接数据库时老师提到过 JSP,刚好这个学期有 JSP 的课程,现做一些基础以及 ...

  6. jdk(jvm)调式工具

    JConsole 可视化工具介绍一. JConsole介绍1.1 JConsole描述Jconsole (Java Monitoring and Management Console),一种基于JMX ...

  7. freeswitch的3XX重定向

    概述 sip协议标准RFC3261中,对3XX重定向有明确的定义. freeswitch中如何使用3XX redirect的特性,如何落地,应用场景有哪些? 环境 centos:CentOS  rel ...

  8. MES系统初探(一)

    什么是MES系统 MES系统是制造执行系统(Manufacturing Execution System)的缩写,是一种用于监控.控制和优化制造过程的软件系统.它主要负责协调生产计划.生产调度.生产执 ...

  9. Vue之使用elementUI的upload上传组件导入csv文件

    最近干活的时候有个需求,需要将csv文件导入到mysql数据库中,前后端框架用的springboot+Vue,组件用的elementUI,下面将分步骤记录实现过程. 1.导入按钮部分: <el- ...

  10. 使用华为路由连接WiFi,被限制网速?

    1.问题 使用华为路由连接WiFi,但是网速非常慢,经常半天才能加载一个界面? 2.解决方法 登陆http://192.168.3.1/网址,发现限速一栏被框选,取消即可