Go1.21 内置函数 clear、min、max 和新标准库包 cmp速览

2023-07-0514:18:37编程语言入门到精通Comments1,269 views字数 2847阅读模式

Go 1.21 中的两个双新增项,分别是新的 3 个内置方法和新的标准库包。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/50165.html

新内置函数

本次新版本新增的内置函数分别是:clear、min、max,面向不同的场景,函数名和函数作用一致,不得不说论命名的艺术。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/50165.html

我们一个个来展开介绍。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/50165.html

clear 函数

引入背景

这个 clear 内置函数的加入,真的是等的够久了。在 2022 年的《Go 大佬良心发现,愿意给 map 加清除了?》的文章中,我们有介绍过。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/50165.html

简单来讲,有如下两个问题:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/50165.html

  1. Go 一直以来大家就在吵要清空 map 等类型的内容物。需要 for-range + delete 来清空,略繁琐。
  2. 有一类神奇的值,叫做:NaN(Not a Number,非数)。它是数值数据类型的一类值,表示未定义或不可表示的值。有开发者发现无法清空 NaN 的值。有 BUG。

扯到今年吵来吵去,扩大了原有的范围。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/50165.html

函数作用

最终 Go1.21 新加入的内置函数 clear 接受 map、slice、指向数组的指针或类型参数类型的参数。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/50165.html

函数签名如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/50165.html

func clear[T ~[]Type | ~map[Type]Type1](t T)

分别有如下的作用:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/50165.html

  • 对于 map,会删除所有条目(包含前面提到的 NaN),将会变成一个空 map。len 属性的值会改变,值为 0 。
  • 对于 slice,会将 slice 或 array 长度内的所有元素设置为相应元素类型的零值。len 属性的值不会改变。
  • 对于泛型的类型参数(type parameter):类型参数的类型集必须只包含 map、slices 或指向数组的指针的类型,clear 函数将会执行实际类型参数所对应的 clear 操作。

演示代码

map 演示代码如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/50165.html

func main() {
 m := map[string]string{"脑子进": "煎鱼了", "煎鱼": "进脑子了"}
 fmt.Printf("m1: %v, len: %d\n", m, len(m))
 clear(m)
 fmt.Printf("m2: %v, len: %d\n", m, len(m))
}

输出结果:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/50165.html

m1: map[煎鱼:进脑子了 脑子进:煎鱼了], len: 2
m2: map[], len: 0

slice 演示代码如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/50165.html

func main() {
 s := make([]string, 3)
 s[0] = "吃"
 s[1] = "煎"
 s[2] = "鱼"

 fmt.Printf("s1: %v, len: %d, cap:%d\n", s, len(s), cap(s))
 clear(s)
 fmt.Printf("s2: %v, len: %d, cap:%d\n", s, len(s), cap(s))
}

输出结果:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/50165.html

s1: [吃 煎 鱼], len: 3, cap:3
s2: [  ], len: 3, cap:3

min、max 函数

这两个函数的诞生主要是 @Ian Lance Taylor 发现 min、max 函数。作用是求最小值和最大值。虽然在功能上很微小。但是在代码中却被广泛使用了,认为值得引入标准库中。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/50165.html

随后被 @Robert Griesemer 往内置函数引导,基于 append 和 copy 内置函数的先例,就获得许多人的点赞认可该观点,就正式加入内置函数了。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/50165.html

Go1.21 内置函数 clear、min、max 和新标准库包 cmp速览

官方给出的演示代码如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/50165.html

var x, y int
m := min(x)                 // m == x
m := min(x, y)              // m 是 x 和 y 中较小的那个

m := max(x, y, 10)          // m 是 x 和 y 中较大的一个,但至少是10
c := max(1, 2.0, 10)        // c == 10.0(浮点类型)
f := max(0, float32(x))     // f 的类型是 float32

var s []string
_ = min(s...)               // 无效:不允许使用 slice 参数
t := max("", "foo", "bar")  // t == "foo" (string 类型)

对于一些特殊值和清空,例如:浮点参数、负零、NaN和无穷大。min、max 函数结果适用以下规则:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/50165.html

   x        y    min(x, y)    max(x, y)

  -0.0    0.0         -0.0          0.0  
  -Inf      y         -Inf            y    
  +Inf      y            y         +Inf    
   NaN      y          NaN          NaN   
  • 第一行:负零比(非负)零小。
  • 第二行:负无穷大比任何其他数字都小。
  • 第三行:正无穷大于任何其他数字。
  • 第四行:如果有任何一个参数是 NaN,结果就是 NaN。

新标准库包

本次在标准库中新增的包是 cmp(全称应该是 compare),主要是提供比较、对比等功能。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/50165.html

这块比较简单,直接上源码就懂了:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/50165.html

package cmp

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

func Less[T Ordered](x, y T) bool {
 return (isNaN(x) && !isNaN(y)) || x < y
}

func Compare[T Ordered](x, y T) int {
 xNaN := isNaN(x)
 yNaN := isNaN(y)
 if xNaN && yNaN {
  return 0
 }
 if xNaN || x < y {
  return -1
 }
 if yNaN || x > y {
  return +1
 }
 return 0
}

func isNaN[T Ordered](x T) bool {
 return x != x
}
  • Less:判断 x 是否小于 y。对于浮点类型,NaN 被认为小于任何非 NaN、 而 -0.0 不小于(等于)0.0。
  • Compare:比较 x 和 y,返回对应预定义的枚举值:
    • 如果 x 小于 y,则返回 -1
    • 如果 x 等于 y,则返回 0
    • 如果 x 大于 y,则返回 +1
  • isNaN:判断 x 是否为 NaN。

前面提到的 min、max 内置函数,本来也是要放在 cmp 包里的,不过非常荣幸的被 “提拔” 了。仅留下这几个方法。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/50165.html

总结

今天给大家分享了 Go1.21 的一些新内置函数 clear、min、max 和新标准库包 cmp。虽然看起来都是辅助类工具,但他们的加入也是挺费劲的,花了不少时间和讨论。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/50165.html

以后写业务代码和八股文时,可以适当使用这些函数。又能够简化部分代码和逻辑了。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/50165.html

  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/ymba/50165.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定