我们好,我是煎鱼。
前面给我们共享了 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 加清除了?》的文章中,我们有介绍过。
简略来讲,有如下两个问题:
- Go 一直以来我们就在吵要清空 map 等类型的内容物。需要 for-range + delete 来清空,略繁琐。
- 有一类神奇的值,叫做: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/blo… 已录入,学习 Go 言语能够看 Go 学习地图和路线,欢迎 Star 催更。
Go 图书系列
- Go 言语入门系列:初探 Go 项目实战
- Go 言语编程之旅:深入用 Go 做项目
- Go 言语规划哲学:了解 Go 的为什么和规划思考
- Go 言语进阶之旅:进一步深入 Go 源码
引荐阅览
- Go1.21 速览:过了一年半,slices、maps 泛型库总算要参加规范库。。。
- Go1.21 速览:Go 总算打算进一步支撑 WebAssembly 了。。。
- 写在 2023 年初的后端社招面试经历(四年经历):字节 米哈游 富途 猿辅导