首页 > 其他分享 >go 1.21:cmp

go 1.21:cmp

时间:2023-09-02 12:13:04浏览次数:45  
标签:google 自定义 go 1.21 com 比较 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 具有以下主要特点:

  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: 恋水无意


标签:google,自定义,go,1.21,com,比较,cmp
From: https://www.cnblogs.com/lianshuiwuyi/p/17673518.html

相关文章

  • Django系统报错总结 1
    Django系统报错总结1 本章节,继续总结前面商品系统编写中遇到的报错问题TypeError:Product()gotunexpectedkeywordarguments:'update_time','seller'因为在Product类中没有定义参数update_time和seller。要解决这个问题,你需要确保在Product类中添加这些参数的定义。......
  • django+drf开发一些个人的标准化
    最近在改造一下个人的开发风格。特分享一下。子应用我一般放在apps中,每个不同模块的子应用起不同的名字。startapp后自己移动一下,记得修改一下Appconfig中的name即可。子应用中创建services.py或者如有需要可以创建services模块再细分。所有业务放到services中编写。views一律......
  • CH32X035 运放OPA和比较器CMP的应用
    CH32X035运放OPA和比较器CMP的应用 一、关于CH32X035介绍CH32X035内置USB和PDPHY,20KBRAM,62KBFLASH,支持USBHost主机和USBDevice设备功能、USBPD及Type-C快充功能,内置可编程协议I/O控制器,提供了OPA运放、CMP电压比较器、USART串口、I2C、SPI、定时器、12位ADC、Touchkey......
  • 为何每个开发者都在谈论Go?
    本文深入探讨了Go语言的多个关键方面,从其简洁的语法、强大的并发支持到出色的性能优势,进一步解析了Go在云原生领域的显著应用和广泛的跨平台支持。文章结构严谨,逐一分析了Go语言在现代软件开发中所占据的重要地位和其背后的技术原理。关注TechLead,分享互联网架构、云服务技术......
  • MongoDB系列之分片管理
    1.查看当前状态1.1查看配置信息mongos>useconfig//查看分片mongos>db.shards.find(){"_id":"study","host":"study/localhost:27018,localhost:27019,localhost:27020","state":1}//查看分片集合信息mongos>db.collecti......
  • RunnerGo:提升性能测试效率的强大利器
    在现代软件开发中,性能测试是确保应用程序在真实负载下正常运行的关键环节。为了满足不断增长的用户需求和保证应用程序的性能稳定性,这里给大家介绍RunnerGo,这是一款功能强大、易于使用的性能测试平台,能够极大地提升性能测试的效率和质量。首先,RunnerGo采用Go语言开发,相较于传统的......
  • Go 切片
    切片与数组类似,但更强大和灵活。与数组一样,切片也用于在单个变量中存储相同类型的多个值。然而,与数组不同的是,切片的长度可以根据需要增长和缩小。在Go中,有几种创建切片的方法:使用[]datatype{values}格式从数组创建切片使用make()函数使用[]datatype{values}格式创建切片......
  • 2023-09-01:用go语言编写。给出两个长度均为n的数组, A = { a1, a2, ... ,an }, B = { b1
    2023-09-01:用go语言编写。给出两个长度均为n的数组,A={a1,a2,...,an},B={b1,b2,...,bn}。你需要求出其有多少个区间[L,R]满足:数组A中下标在[L,R]中的元素之和在[La,Ra]之中,数组B中下标在[L,R]中的元素之和在[Lb,Rb]之中。输入:第一行有一个正整数N(1<=N<=100000),代表两......
  • 2023-09-01:用go语言编写。给出两个长度均为n的数组, A = { a1, a2, ... ,an }, B = { b1
    2023-09-01:用go语言编写。给出两个长度均为n的数组,A={a1,a2,...,an},B={b1,b2,...,bn}。你需要求出其有多少个区间[L,R]满足:数组A中下标在[L,R]中的元素之和在[La,Ra]之中,数组B中下标在[L,R]中的元素之和在[Lb,Rb]之中。输入:第一行有一个正整数N(1<=N<=10000......
  • Go 切片
    切片与数组类似,但更强大和灵活。与数组一样,切片也用于在单个变量中存储相同类型的多个值。然而,与数组不同的是,切片的长度可以根据需要增长和缩小。在Go中,有几种创建切片的方法:使用[]datatype{values}格式从数组创建切片使用make()函数使用[]datatype{values}格式创建切......