Go 1.21.0 新特性min 和 max 内置函数解析

news/2024/11/30 13:34:10/

1.介绍

Go 1.21.0 是 Go 语言的最新版本,它将在 2023 年 8 月发布,会带来了一些语言和工具的变化。其中一个值得关注的变化是增加了两个新的内置函数 min 和 max,用来对任意可比较类型进行最小值和最大值的操作。这是很常见的需求,现在有内置实现了。本文将介绍这两个函数的背景、规范、实现原理和使用示例。

1.1增加这两个函数的背景

在 Go 语言中,有很多情况需要对一组值进行最小值或最大值的操作,比如排序、统计、筛选等。然而,Go 语言没有提供直接的方法来实现这个功能,开发者需要自己编写循环来完成。(标准库 math 有对应的函数,但只支持接受 float64 类型。)

但这个确实很常见的需求。为此,Go 1.21.0 引入了两个新的内置函数 min 和 max,它们可以对任意可比较类型进行最小值或最大值的操作,无需编写循环或引入第三方库。

1.2长什么样?

根据 Go builtin 文档,min 和 max 的函数原型如下:

// The max built-in function returns the largest value of a fixed number of
// arguments of [cmp.Ordered] types. There must be at least one argument.
// If T is a floating-point type and any of the arguments are NaNs,
// max will return NaN.
func max[T cmp.Ordered](x T, y ...T) T// The min built-in function returns the smallest value of a fixed number of
// arguments of [cmp.Ordered] types. There must be at least one argument.
// If T is a floating-point type and any of the arguments are NaNs,
// min will return NaN.
func min[T cmp.Ordered](x T, y ...T) T

从函数原型可以看出,min 和 max 的参数和返回值都是同一种类型,必须是可比较的有序类型,比如整数、浮点数、字符串等。如果只有一个参数,它就是最小值或最大值。如果有多个参数,min 和 max 会根据 < 运算符来比较大小,并返回最小值或最大值。如果有多个相同的最小值或最大值,min 会返回最左边的一个,max 会返回最右边的一个。如果没有参数,或者参数不是有序类型,min 和 max 编译不通过。

2.这两个函数的实现原理

min 和 max 是内置函数,它们的实现是在编译器层面完成的,而不是在运行时。具体来说,它们是在编译器的 SSA (Static Single Assignment) 阶段进行转换的,将 min 和 max 的调用转换为对应的循环代码。这样做的好处是可以避免引入新的运行时函数,也可以让编译器有更多的优化空间。

具体的实现代码在 src/cmd/compile/internal/types2/builtins.go 中:(部分代码)

for i, a := range args {if a.mode == invalid {return}if !allOrdered(a.typ) {check.errorf(a, InvalidMinMaxOperand, invalidArg+"%s cannot be ordered", a)return}// The first argument is already in x and there's nothing left to do.if i > 0 {check.matchTypes(x, a)if x.mode == invalid {return}if !Identical(x.typ, a.typ) {check.errorf(a, MismatchedTypes, invalidArg+"mismatched types %s (previous argument) and %s (type of %s)", x.typ, a.typ, a.expr)return}if x.mode == constant_ && a.mode == constant_ {if constant.Compare(a.val, op, x.val) {*x = *a}} else {x.mode = value}}
}

可以看到,编译器将 min 的调用转换为一个循环,从第二个参数开始遍历切片,并与第一个参数比较大小,更新最小值/最大值变量。

3.使用示例

min 和 max 函数的使用非常简单,只需要将要比较的值作为参数传入即可。

下面是一些使用示例:(在线运行地址 https://go.dev/play/p/AQ6HD_gfame?v=gotip)

package mainimport ("fmt""math"
)func main() {// 比较整数fmt.Println(min(1, 2, 3)) // 1fmt.Println(max(1, 2, 3)) // 3// 比较浮点数fmt.Println(min(1.5, 2.5, 3.5)) // 1.5fmt.Println(max(1.5, 2.5, 3.5)) // 3.5// 浮点数包含 NaNfmt.Println(min(1.5, math.NaN(), 3.5)) // NaNfmt.Println(max(1.5, math.NaN(), 3.5)) // NaN// 比较字符串fmt.Println(min("apple", "banana", "cherry")) // applefmt.Println(max("apple", "banana", "cherry")) // cherry
}

输出结果:

1
3
1.5
3.5
NaN
NaN
apple
cherry

可以看到,min 和 max 函数可以方便地对不同类型的值进行最小值和最大值的操作,无需编写额外的代码。

4.总结

本文介绍了 Go 1.21.0 新增的两个内置函数 min 和 max,它们可以对任意可比较类型进行最小值和最大值的操作。目前 Go1.21.0 还未发布,其中的具体实现可能会发生变化。


http://www.ppmy.cn/news/751375.html

相关文章

【数据可视化】SVG(一)

一、邂逅SVG和初体验 什么是SVG  SVG全称为&#xff08;Scalable Vector Graphics&#xff09;&#xff0c;即可缩放矢量图形。&#xff08;矢量定义&#xff1a;既有大小又有方向的量。在物理学中称作矢量&#xff0c;如一个带箭头线段&#xff1a;长度表示大小&#xff0…

AI for Science 交流会来了!科学计算前沿邀您共同探讨

随着深度学习不断驱动技术创新&#xff0c;人工智能科学计算迈向高质量发展道路。百度飞桨作为科学计算的坚定支持者&#xff0c;计划于7月13日举办飞桨科学计算线下交流会。本次交流会以百度飞桨深度学习框架为基座&#xff0c;广泛联动人工智能科学计算领域头部专家学者、高等…

06_STM32按键试验

试验介绍&#xff0c;按下WK_up按键蜂鸣器响&#xff0c;在按下蜂鸣器停&#xff0c;按下KEY2按键LED0反转&#xff0c;按下KEY1按键LED1反转&#xff0c;按下KEY0按键LED0 LED1同时反转。 硬件连接: Key原理图: 由原理图可以看出KEY0 KEY1 KEY2一端是连接芯片引脚PE4 PE3 PE2按…

STM32个人笔记-按键硬件消抖

笔记来自于STM32嵌入式开发公众号&#xff1a;按键的硬件消抖电路原理。 抄个小本本&#xff0c;做个小笔记。用最短的时间去了解新玩意&#xff0c;岂不美哉。 目录 硬件消抖一般实现方式&#xff1a;RS触发器、电容滤波。 电容滤波 RS触发器 通常的按键所用开关为机械弹…

【043】基于51单片机的篮球比赛积分计时系统Proteus仿真

一、压缩包资料内容 &#xff08;1&#xff09;、基于51单片机的篮球比赛积分计时系统proteus仿真设计一份&#xff1b; &#xff08;2&#xff09;、基于51单片机的篮球比赛积分计时系统proteus仿真设计keli源代码一份&#xff1b; &#xff08;3&#xff09;、基于51单片机…

STM32学习笔记(一)stm32c8t6实现按键的单击、连击、长按。

记录一下自己学习的过程 1.硬件连接 用的是c8t6的最小系统板&#xff0c;通过面包板连接按键&#xff0c;将PB11口用作按键输入。同时还连接了一块oled的屏方便查看现象。 2.代码部分 核心思想和代码总体框架来自博客&#xff1a;(7条消息) stm32【按键处理&#xff1a;单击…

2·ESP32-C3入门教程——按键基本法

【写在前面】经过了点灯→定时器点灯→PWM点灯的学习之后&#xff0c;逐渐开始对ESP32 C3整体的框架有了一定认识【 点灯模块链接指路&#xff1a;http://t.csdn.cn/xOBmI】也掌握了一些理解和学习代码的思路&#xff0c;这一章咱们聊一聊按键的控制。 目录 GPIO输出与按键控制…

2022年12月份青少年软件编程Python等级考试试卷三级真题(含答案)(未完成)

2022-12 Python三级真题 分数&#xff1a;100 题数&#xff1a;38 测试时长&#xff1a;60min 一、单选题(共25题&#xff0c;共50分) 1. 列表L1中全是整数&#xff0c;小明想将其中所有奇数都增加1&#xff0c;偶数不变&#xff0c;于是编写了如下图所示的代码。请问&a…