当前位置: 首页 > news >正文

Go 1.21 新内置函数:min、max 和 clear

max 函数
func max[T cmp.Ordered](x T, y …T) T
这是一个泛型函数,用于从一组值中寻找并返回 最大值,该函数至少要传递一个参数。在上述函数签名中,T 表示类型参数,它必须满足 cmp.Ordered 接口中定义的数据类型要求,该接口的定义如下所示

type Ordered interface {~int | ~int8 | ~int16 | ~int32 | ~int64 |~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr |~float32 | ~float64 |~string
}

使用示例
了解了 max 函数的定义后,让我们一起来学习如何使用它。

package mainimport "fmt"func main() {var a1, a2, a3 int64 = 1, 2, 3maxA := max(a1, a2, a3)fmt.Printf("%T, %d\n", maxA, maxA) // int64, 3var f1, f2, f3 float64 = 1.0, 2.0, 3.0maxF := max(f1, f2, f3)fmt.Printf("%T, %.1f\n", maxF, maxF) // float64, 3.0var s1, s2, s3 string = "aaa", "aab", "aac"maxS := max(s1, s2, s3)fmt.Printf("%T, %s\n", maxS, maxS) // string, aac
}

在上述示例中,使用了 max 函数分别对 int64、float64 和 string 类型的一组值进行比较并获取最大值,值得注意的地方是 string 类型的比较原理,它是 基于字节的字典顺序对字符串进行比较。

min 函数
func min[T cmp.Ordered](x T, y …T) T

该函数与 max 函数的功能相反,用于从一组值中寻找并返回 最小值,同样传递进来的值类型也必须满足 cmp.Ordered 接口中定义的数据类型要求。

使用示例

package mainimport "fmt"func main() {var a1, a2, a3 int64 = 1, 2, 3minA := min(a1, a2, a3)fmt.Printf("%T, %d\n", minA, minA) // int64, 1var f1, f2, f3 float64 = 1.0, 2.0, 3.0minF := min(f1, f2, f3)fmt.Printf("%T, %.1f\n", minF, minF) // float64, 1.0var s1, s2, s3 string = "aaa", "aab", "aac"minS := min(s1, s2, s3)fmt.Printf("%T, %s\n", minS, minS) // string, aaa
}

在上述示例中,使用了 min 函数分别对 int64、float64 和 string 类型的一组值进行比较并获取最小值,string 类型的比较原理与 max 函数的比较原理相同。
clear 函数
func clear[T ~[]Type | ~map[Type]Type1](t T)
该函数接收一个参数 t,用于清空变量 t (类型为 slice 或 map) 中的元素。

如果传递的是切片类型变量,则会将切片的所有元素赋值为该切片类型的零值;
如果传递的是 map 类型变量,则会清空 map 类型变量的元素;
如果传递的是自定义泛型类型(例如 type MySlice[T any] []T),则类型集中所有类型必须是 slice 或 map。

使用示例

package mainimport "fmt"type MySlice[T any] []T  type MyMap[K comparable, V any] map[K]Vfunc main() {s := []int{1, 2, 3, 4}clear(s)fmt.Printf("len: %d, cap: %d, elems: %v\n", len(s), cap(s), s) // len: 4, cap: 4, elems: [0 0 0 0]m := map[string]int{"Apple": 1, "Banana": 2}clear(m)fmt.Printf("len: %d, elems: %v\n", len(m), m) // len: 0, elems: map[]// 自定义泛型切片类型变量mySlice := MySlice[string]{"公众号:Go技术干货", "陈明勇", "Gopher"}clear(mySlice)fmt.Printf("len: %d, cap: %d, elems: %v\n", len(mySlice), cap(mySlice), mySlice) // len: 3, cap: 3, elems: [  ]// 自定义泛型 map 类型变量myMap := MyMap[string, int]{"Apple": 1, "Banana": 2}clear(myMap)fmt.Printf("len: %d, elems: %v\n", len(myMap), myMap) // len: 0, elems: map[]
}

在上述示例中,演示了如何通过 clear 函数对切片或 map 变量进行删除或清空操作,clear 函数不仅能接收 slice 和 map 类型的变量,还能接收我们所自定义的泛型类型参数,但是在使用时必须确保类型参数集中所有类型必须是 slice 或 map。
值得注意的是:使用 clear 函数清空切片元素时,并不会真正的删除其中的元素,而是会将所有元素都设置为对应类型的零值。这意味着切片仍然保留其原始长度和容量,但元素的内容被清空。

小结
本文详细介绍了 Go 1.21.0 版本中新增的内置函数 max、min、和 clear。通过使用这些函数,我们无需再自行定义比较大小或清空切片以及 map 变量的函数。
遗憾的是,要彻底清空切片并将长度和容量都置为 0,仍然需要另外封装一个函数来实现。因为 clear 函数只是将切片的元素赋值为相应类型的零值,而未改变其长度和容量。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 如何避免常见的R语言学习陷阱?
  • 数据中台运营与实战案例集锦(125页PPT)
  • 【区块链+金融服务】基于区块链的区域股权金融综合服务平台 | FISCO BCOS应用案例
  • 多台USB 3.0相机启动时部分相机无法打开
  • 【SpringCloud】什么是MQ
  • Linux内核编程(十二)热插拔
  • Linux云计算 |【第二阶段】OPERATION-DAY2
  • CSS 伪类和伪元素
  • 5款好用的录屏软件大测评!2024最新视频录制软件排行榜
  • 8款必备人事管理系统,助力企业高效运营
  • 算法:最长递增子序列
  • docker数据卷、资源控制
  • Java中Spring基础知识理解
  • 如何用剪映自动批量生成左右分屏的视频?
  • 080:vue+mapbox中interpolate 的详细解释
  • JavaScript-如何实现克隆(clone)函数
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • AngularJS指令开发(1)——参数详解
  • AWS实战 - 利用IAM对S3做访问控制
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • Cookie 在前端中的实践
  • CSS3 变换
  • express.js的介绍及使用
  • Git的一些常用操作
  • Hibernate最全面试题
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • k8s 面向应用开发者的基础命令
  • MySQL QA
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • tweak 支持第三方库
  • 第十八天-企业应用架构模式-基本模式
  • 离散点最小(凸)包围边界查找
  • 前嗅ForeSpider采集配置界面介绍
  • 设计模式(12)迭代器模式(讲解+应用)
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • 阿里云ACE认证之理解CDN技术
  • ​如何在iOS手机上查看应用日志
  • !!Dom4j 学习笔记
  • # 利刃出鞘_Tomcat 核心原理解析(二)
  • #includecmath
  • $(selector).each()和$.each()的区别
  • $.each()与$(selector).each()
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (Oracle)SQL优化技巧(一):分页查询
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (几何:六边形面积)编写程序,提示用户输入六边形的边长,然后显示它的面积。
  • (七)Knockout 创建自定义绑定
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (四) Graphivz 颜色选择
  • (一)SvelteKit教程:hello world
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...