关于go:Go121-速览新内置函数-clearminmax-和新标准库包-cmp

40次阅读

共计 2771 个字符,预计需要花费 7 分钟才能阅读完成。

大家好,我是煎鱼。

后面给大家分享了 Go1.21 正式不反对 macOS 10.13 和 10.14 的反对。吓得我连忙把我的 2017 款的老爷机从 10.14 升成 13.4。感觉 mbp 曾经变成了暖宝宝。😅

明天给大家分享的是 Go 1.21 中的两个双新增项,别离是新的 3 个内置办法和新的规范库包。

新内置函数

本次新版本新增的内置函数别离是:clear、min、max,面向不同的场景,函数名和函数作用统一,不得不说论命名的艺术。

咱们一个个来开展介绍。

clear 函数

引入背景

这个 clear 内置函数的退出,真的是等的够久了。在 2022 年的《Go 大佬良心发现,违心给 map 加革除了?》的文章中,咱们有介绍过。

简略来讲,有如下两个问题:

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

扯到往年吵来吵去,扩充了原有的范畴。

函数作用

最终 Go1.21 新退出的内置函数 clear 承受 map、slice、指向数组的指针或类型参数类型的参数。

函数签名如下:

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

别离有如下的作用:

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

演示代码

map 演示代码如下:

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))
}

输入后果:

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

slice 演示代码如下:

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))
}

输入后果:

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

min、max 函数

这两个函数的诞生次要是 @Ian Lance Taylor 发现 min、max 函数。作用是求最小值和最大值。尽管在性能上很渺小。然而在代码中却被宽泛应用了,认为值得引入规范库中。

随后被 @Robert Griesemer 往内置函数疏导,基于 append 和 copy 内置函数的先例,就取得许多人的点赞认可该观点,就正式退出内置函数了。

官网给出的演示代码如下:

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 函数后果实用以下规定:

   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),次要是提供比拟、比照等性能。

这块比较简单,间接上源码就懂了:

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 包里的,不过十分荣幸的被“提拔”了。仅留下这几个办法。

总结

明天给大家分享了 Go1.21 的一些新内置函数 clear、min、max 和新规范库包 cmp。尽管看起来都是辅助类工具,但他们的退出也是挺吃力的。

当前写业务代码和八股文时,能够适当应用这些函数。又可能简化局部代码和逻辑了。

文章继续更新,能够微信搜【脑子进煎鱼了】浏览,本文 GitHub github.com/eddycjy/blog 已收录,学习 Go 语言能够看 Go 学习地图和路线,欢送 Star 催更。

Go 图书系列

  • Go 语言入门系列:初探 Go 我的项目实战
  • Go 语言编程之旅:深刻用 Go 做我的项目
  • Go 语言设计哲学:理解 Go 的为什么和设计思考
  • Go 语言进阶之旅:进一步深刻 Go 源码

举荐浏览

  • Go1.21 速览:过了一年半,slices、maps 泛型库终于要退出规范库。。。
  • Go1.21 速览:Go 终于打算进一步反对 WebAssembly 了。。。
  • 写在 2023 年初的后端社招面试经验(四年教训):字节 米哈游 富途 猿辅导

正文完
 0