标准库 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. 火山引擎DataLeap如何解决SLA治理难题(一):应用场景与核心概念介绍

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 基于火山引擎分布式治理的理念,数据平台数据治理团队自研了火山引擎DataLeap SLA保障平台,目前已在字节内部 ...

  2. PPT 画册风格

    图片嵌入 图片填充 图片裁剪 字体 PPT 关掉再打开. 排列对齐 图片下载 https://www.pexels.com http://www.500px.com http://www.bing.c ...

  3. The Cluster ID Zc7nlyfTQ5qPbhY2d8I_3A doesn't match stored clusterId Some(ZvQZIX9gTB-dj05be_i_-w) in meta.properties.

    启动kafka时报错(部分信息): [2022-05-12 20:26:05,589] INFO Cluster ID = Zc7nlyfTQ5qPbhY2d8I_3A (kafka.server.K ...

  4. ME21N 采购订单新增页签增强

    1.实现效果 根据客制化需求,要在采购订单中新增大量字段,所以要在界面上添加一个单独的页签.效果如下: 2.增强实现 2.1.增强结构 因为是在抬头上边添加,所以增强CI_EKKODB结构 2.2.函 ...

  5. 【每日一题】6.Rinne Loves Edges (树形DP)

    题目链接:Here 树形DP 算法讲解:Here 无向联通图其实就是树的形状,其次让我们以 s 为根使得所有的叶子节点不能到达根并且让删去边权的总和最小,那么就是典型的 树形DP 了. \(dp_i\ ...

  6. 技术分享 | 不同格式标准SBOM清单横评:SPDX、CDX和DSDX

    为了保证安全性.降低开发.采购及维护的相关成本,复杂动态的现代软件供应链对软件资产透明度提出了更高的要求.使用清晰的软件物料清单(SBOM)收集和共享信息,并在此基础上进行漏洞.许可证和授权管理等,可 ...

  7. <vue初体验> 基础知识 1、vue的引入和使用体验

    系列导航 <vue初体验> 一. vue的引入和使用体验 <vue初体验> 二. vue的列表展示 <vue初体验> 三. vue的计数器 <vue初体验&g ...

  8. 5分钟教会你如何在生产环境debug代码

    前言 有时出现的线上bug在测试环境死活都不能复现,靠review代码猜测bug出现的原因,然后盲改代码直接在线上测试明显不靠谱.这时我们就需要在生产环境中debug代码,快速找到bug的原因,然后将 ...

  9. C++跨DLL内存所有权问题探幽(三)导致堆问题的可能性

    0xC0000374: 堆已损坏. (参数: 0x00007FFA1E9787F0). _Mem 是 nullptr 这里提供一个可能性,不一定是内存所属地址冲突的问题,除了MT和 MD编译,还有可能 ...

  10. SQL函数——时间函数

    1.使用 NOW() . CURDATE().CURTIME() 获取当前时间 在这里我有一个问题想问问大家,你们平时都是怎么样子获取时间的呢?是不是通过手表.手机.电脑等设备了解到的,那么你们有没有 ...