你知道吗?Go新增加了三个内建函数

Go 1.21中新增加了三个内建的函数,相比以前的lencapdeleteappendclosepanic等函数,又有了新的变化,让我们一起来看看吧。

clear

clear一直是大家想要的一个函数,新增的这个函数,用来操作map和slice对象:

1
func clear[T ~[]Type | ~map[Type]Type1](t T)
  • 对于map对象: clear函数清空map对象的所有的元素
  • 对于slice对象: clear函数将所有的元素设置为元素类型的零值,长度不变,容量不变

写一个程序测试下,的的确确如上所述:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
func testClear() {
m := map[float64]bool{100: true, 1000: true, math.NaN(): true, math.NaN(): true}
delete(m, math.NaN())
fmt.Printf("before clear, m len: %d\n", len(m))
clear(m)
fmt.Printf("after clear, m len: %d\n", len(m))
s := make([]float64, 0, 1024*1024)
for i := 0; i < 10; i++ {
s = append(s, float64(i))
}
fmt.Printf("before clear, s len: %d, s cap: %d\n", len(s), cap(s))
clear(s)
fmt.Printf("after clear, s len: %d, s cap: %d\n", len(s), cap(s))
fmt.Println(s)
}

运行gotip run main.go, 输出结果

1
2
3
4
5
before clear, m len: 4
after clear, m len: 0
before clear, s len: 10, s cap: 1048576
after clear, s len: 10, s cap: 1048576
[0 0 0 0 0 0 0 0 0 0]

min 和 max函数

这俩新增加的求最大和最小值的函数,比math.Maxmath.Min方便多了。
首先支持的类型是Ordered类型的,能做+操作的类型都可以做参数,比如string类型也可以,其次它还支持不定长参数,方便使用。

比如下面的调用:

1
2
3
4
5
6
7
8
9
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 中最大的那个, 也就是最少是 10
c := max(1, 2.0, 10) // c == 10.0 (浮点数)
f := max(0, float32(x)) // float32类型
var s []string
_ = min(s...) // 无效: 不支持 slice 参数
t := max("", "foo", "bar") // t == "foo" (支持string类型)

对浮点数的极限值,有如下规则:

1
2
3
4
5
6
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

字符串按照字节进行比较。