Go1.21新增cmp包的用法详解

 更新时间:2023年08月23日 08:33:33   作者:路多辛  
Go 1.21新增的 cmp 包提供了与比较有序值相关的类型和函数,前几篇文章讲解的 slices 包中的函数有大量使用到 cmp 包中的函数和类型,下面我们就来看看cmp包的相关函数用法吧

cmp.Compare 函数

定义如下:

func Compare[T Ordered](x, y T) int

返回值有以下几种情况:

  • 如果 x 小于 y,返回-1
  • 如果 x 等于 y,返回 0
  • 如果 x 大于 y,返回 1

对于浮点类型,NaN 被认为小于任何非 NaN 的值, NaN 被认为等于 NaN, -0.0 被认为等于 0.0。简单示例如下:

package main
import (
    "cmp"
    "fmt"
    "math"
)
func main() {
    fmt.Println(cmp.Compare(1, 2))                   // -1
    fmt.Println(cmp.Compare(1, 1))                   // 0
    fmt.Println(cmp.Compare(2, 1))                   // 1
    fmt.Println(cmp.Compare(1, math.NaN()))          // 1
    fmt.Println(cmp.Compare(-1, math.NaN()))         // 1
    fmt.Println(cmp.Compare(math.NaN(), math.NaN())) // 0
    fmt.Println(cmp.Compare(-0.0, 0.0))              // 0
}

cmp.Less 函数

定义如下:

func Less[T Ordered](x, y T) bool

判断 x 是否小于 y。对于浮点类型,NaN 被认为小于任何非 NaN 的值,并且 -0.0 不小于(等于) 0.0。

package main
import (
    "cmp"
    "fmt"
    "math"
)
func main() {
    fmt.Println(cmp.Less(1, 2))                   //true
    fmt.Println(cmp.Less(1, 1))                   // false
    fmt.Println(cmp.Less(2, 1))                   // false
    fmt.Println(cmp.Less(1, math.NaN()))          // false
    fmt.Println(cmp.Less(-1, math.NaN()))         // false
    fmt.Println(cmp.Less(math.NaN(), math.NaN())) // false
    fmt.Println(cmp.Less(math.NaN(), -1.0))       // true
    fmt.Println(cmp.Less(-0.0, 0.0))              // false
}

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。

到此这篇关于Go1.21新增cmp包的用法详解的文章就介绍到这了,更多相关Go1.21 cmp包内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • GO语言导入自己写的包(同级目录和不同目录)

    GO语言导入自己写的包(同级目录和不同目录)

    本文介绍了如何在Go语言项目中导入同级目录和不同目录的包,详细解释了创建文件结构、编写主函数、同级目录和不同目录方法的调用,适合初学者参考,帮助理解Go项目的基本构建和包管理
    2024-09-09
  • Golang多个域名的跨域资源共享的实现

    Golang多个域名的跨域资源共享的实现

    本文主要介绍了Golang多个域名的跨域资源共享的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-02-02
  • Golang通过包长协议处理TCP粘包的问题解决

    Golang通过包长协议处理TCP粘包的问题解决

    本文主要介绍了Golang通过包长协议处理TCP粘包的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • golang中gin框架接入jwt使用token验证身份

    golang中gin框架接入jwt使用token验证身份

    本文主要介绍了golang中gin框架接入jwt使用token验证身份,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • 一文教你如何快速学会Go的struct数据类型

    一文教你如何快速学会Go的struct数据类型

    结构是表示字段集合的用户定义类型。它可以用于将数据分组为单个单元而不是将每个数据作为单独的值的地方。本文就来和大家聊聊Go中struct数据类型的使用,需要的可以参考一下
    2023-03-03
  • go goth封装第三方认证库示例详解

    go goth封装第三方认证库示例详解

    这篇文章主要为大家介绍了go goth封装第三方认证库示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • 初探Golang数据结构之Slice的使用

    初探Golang数据结构之Slice的使用

    在学习Go语言时,一直对数组和切片的使用场景好奇,不明白为什么推荐使用切片来代替数组,所以本文就来和大家梳理一下Slice切片的相关知识吧
    2023-09-09
  • Go语言进行多时区时间转换的示例代码

    Go语言进行多时区时间转换的示例代码

    本文介绍了使用Go语言进行多时区时间转换,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-12-12
  • go内存缓存如何new一个bigcache对象示例详解

    go内存缓存如何new一个bigcache对象示例详解

    这篇文章主要为大家介绍了go内存缓存如何new一个bigcache对象示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • Go语言包管理工具Godep的用法

    Go语言包管理工具Godep的用法

    这篇文章介绍了Go语言包管理工具Godep的用法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07

最新评论