有一天,突然在项目中看到有个clear的函数,还以为是本地定义的函数,但在本地却没有找到相关定义。鼠标放上那么一点,才发现是Go语言中内置的函数,恕我孤陋寡闻了。

于是,就在网上各种搜索准备一探究竟,才知道clear函数是Go1.21版本中引入的内置函数,一起被引入的还有maxmin函数。

clear主要用于清理mapslice的,在此之前一直没有快速清理mapslice的办法,例如清空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,会将所有元素设置为各自元素的零值,长度不会改变
  • 对于泛型参数,类型参数的类型集只能包含mapslice类型
  • 如果传入的是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函数并不那么耀眼,但还是非常实用的,还有同样是新加入的maxmin的函数。随着这些新加入的内置函数,对于开发者来说是福利和便捷,使用它可以不断简化我们的代码和逻辑。

与时俱进,不断学习,时刻保持对新事物的追求与探索,不断提升自己的能力水平。