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

这篇具有很好参考价值的文章主要介绍了Go 1.21.0 新特性min 和 max 内置函数解析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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 main

import (
 "fmt"
 "math"
)

func main() {
 // 比较整数
 fmt.Println(min(1, 2, 3)) // 1
 fmt.Println(max(1, 2, 3)) // 3

 // 比较浮点数
 fmt.Println(min(1.5, 2.5, 3.5)) // 1.5
 fmt.Println(max(1.5, 2.5, 3.5)) // 3.5

 // 浮点数包含 NaN
 fmt.Println(min(1.5, math.NaN(), 3.5)) // NaN
 fmt.Println(max(1.5, math.NaN(), 3.5)) // NaN

 // 比较字符串
 fmt.Println(min("apple", "banana", "cherry")) // apple
 fmt.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 还未发布,其中的具体实现可能会发生变化。文章来源地址https://www.toymoban.com/news/detail-527441.html

到了这里,关于Go 1.21.0 新特性min 和 max 内置函数解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python3 max() 函数 -求最大值、Python3 min() 函数 -求最小值

    ​ max() ​ 方法返回给定参数的最大值,参数可以为序列。 以下是​  max() ​ 方法的语法: x -- 数值表达式。 y -- 数值表达式。 z -- 数值表达式。 返回给定参数的最大值。 以下展示了使用 ​ max() ​ 方法的实例: 尝试一下 以上实例运行后输出结果为: ​ min()  ​方法返回给

    2023年04月26日
    浏览(45)
  • golang1.21新特性速览

    经过了半年左右的开发,golang 1.21 在今天早上正式发布了。 这个版本中有不少重要的新特性和变更,尤其是在泛型相关的代码上。 因为有不少大变动,所以建议等第一个patch版本也就是1.21.1出来之后再进行升级,以免遇到一些意外的bug带来麻烦。 好了,一起来看看1.21带来的

    2024年02月13日
    浏览(25)
  • 100天精通Golang(基础入门篇)——第15天:深入解析Go语言中函数的应用:从基础到进阶,助您精通函数编程!(进阶)

    🌷 博主 libin9iOak带您 Go to Golang Language.✨ 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍》学会IDEA常用操作,工作效率翻倍~💐 🪁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批

    2024年02月12日
    浏览(54)
  • 100天精通Golang(基础入门篇)——第12天:深入解析Go语言中的集合(Map)及常用函数应用

    🌷 博主 libin9iOak带您 Go to Golang Language.✨ 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍》学会IDEA常用操作,工作效率翻倍~💐 🪁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批

    2024年02月12日
    浏览(37)
  • Golang内置类型和函数及接口、Init函数和main函数

    1.1. 值类型: 1.2. 引用类型:(指针类型) Go 语言拥有一些不需要进行导入操作就可以使用的内置函数。它们有时可以针对不同的类型进行操作,例如:len、cap 和 append,或必须用于系统级的操作,例如:panic。因此,它们需要直接获得编译器的支持。 go语言中 init 函数用于包

    2024年01月25日
    浏览(24)
  • go 内置函数copy()

    当我们在Go语言中需要将一个切片的内容复制到另一个切片时,可以使用内置的 copy() 函数。 copy() 函数用于将源切片中的元素复制到目标切片中,它有以下形式的签名: 其中, dst 是目标切片, src 是源切片, T 是切片元素的类型。函数返回一个整数值,表示实际复制的元素

    2024年02月14日
    浏览(31)
  • Go语言内置类型和函数

    1.1.1 值类型 1.1.2 引用类型:(指针类型) Go 语言拥有一些不需要进行导入操作就可以使用的内置函数。它们有时可以针对不同的类型进行操作,例如:len、cap 和 append,或必须用于系统级的操作,例如:panic。因此,它们需要直接获得编译器的支持。

    2024年02月08日
    浏览(40)
  • Max-Min算法

    任务调度算法,随着多核处理器的发展,带来了新的挑战。如何利用高效的任务调度策略使得多核处理器充分发挥性能,是急需解决的问题。动态任务调度是根据运行时的情况动态的将任务分配到对应的资源上,但是需要实时的收集系统计算资源、存储资源以及网络资源等信

    2024年02月11日
    浏览(29)
  • 如何理解闭包函数的特性(golang版)

    特性:闭包可以在多次调用之间保持原始状态 我们来看一个例子: 在这个例子中,我们可以将函数 func makeAdder(base int) func(int) int 拆成两部分,分别为: func makeAdder(base int) func(int) int 匿名函数 func(int) int 充当了 makeAdder 函数的返回值。 即 makeAdder 函数接收了一个整数作为参数

    2024年02月16日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包