有一天,突然在项目中看到有个clear
的函数,还以为是本地定义的函数,但在本地却没有找到相关定义。鼠标放上那么一点,才发现是Go
语言中内置的函数,恕我孤陋寡闻了。
于是,就在网上各种搜索准备一探究竟,才知道clear
函数是Go1.21
版本中引入的内置函数,一起被引入的还有max
和min
函数。
clear
主要用于清理map
和slice
的,在此之前一直没有快速清理map
和slice
的办法,例如清空map
中的元素往往需要通过for
遍历并通过delete
去删除元素。
// The clear built-in function clears maps and slices.
// For maps, clear deletes all entries, resulting in an empty map.
// For slices, clear sets all elements up to the length of the slice
// to the zero value of the respective element type. If the argument
// type is a type parameter, the type parameter's type set must
// contain only map or slice types, and clear performs the operation
// implied by the type argument. If t is nil, clear is a no-op.
func clear[T ~[]Type | ~map[Type]Type1](t T)
通过官方的介绍,明确了clear
的作用:
- 对于
map
,会清除所有元素,返回一个空的map
- 对于
slices
,会将所有元素设置为各自元素的零值
,长度不会改变 - 对于
泛型
参数,类型参数的类型集只能包含map
或slice
类型 - 如果传入的是
nil
,不会有任何操作
通过上面的介绍,对clear
内置函数终于有了清晰的了解,下面直接上代码来看看实际效果。
clear map
上面说了,用clear
来清理map,会清除所有元素:
func main() {
salary := map[string]int{"alice": 1000, "bob": 2000}
fmt.Printf("salary: %v, len: %d\n", salary, len(salary))
// output: salary: map[alice:1000 bob:2000], len: 2
clear(salary)
fmt.Printf("salary: %v, len: %d\n", salary, len(salary))
// output: salary: map[], len: 0
}
可以看出,clear
清除map
的元素后,其长度也变成了0
。
clear slice
清除切片,只是把切片里的元素的值改成零
值,并且长度不会改变。
func main() {
salary := []int{1000, 2000}
fmt.Printf("salary: %v, len: %d, cap: %d\n", salary, len(salary), cap(salary))
// output: salary: [1000 2000], len: 2, cap: 2
clear(salary)
fmt.Printf("salary: %v, len: %d, cap: %d\n", salary, len(salary), cap(salary))
// output: salary: [0 0], len: 2, cap: 2
}
将slice
进行clear
后,其所有元素变成了零
值,但其仍然保持着原有的长度和容量。
clear 泛型集合
这里分别定义了一个泛型slice
和一个泛型map
,来试一下效果:
type SalarySlice[T int] []T
type SalaryMap[K string, V int] map[K]V
func main() {
salarySlice := SalarySlice[int]{1000, 2000}
clear(salarySlice)
fmt.Printf("salarySlice: %v, len: %d, cap: %d\n", salarySlice, len(salarySlice), cap(salarySlice))
// output: salarySlice: [0 0], len: 2, cap: 2
salaryMap := SalaryMap[string, int]{"alice": 1000, "bob": 2000}
clear(salaryMap)
fmt.Printf("salaryMap: %v, len: %d\n", salaryMap, len(salaryMap))
// output: salaryMap: map[], len: 0
}
最后
虽然新加入的clear
函数并不那么耀眼,但还是非常实用的,还有同样是新加入的max
和min
的函数。随着这些新加入的内置函数,对于开发者来说是福利和便捷,使用它可以不断简化我们的代码和逻辑。
与时俱进,不断学习,时刻保持对新事物的追求与探索,不断提升自己的能力水平。