Go1.21.0 新特性:不需要循环 delete map 元素了

501次阅读  |  发布于1年以前

早在 2022 年 10 月,rsc 就有一个提案:spec: add clear(x) builtin, to clear map, zero content of slice,主要原因是干掉类似这样的代码:

for k := range m {
    delete(m, k)
}

目前 Go tip 版本已经有 clear 函数了。它的函数签名如下:

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

clear 可以清空切片或 map 类型的值,将其底层元素全部置为零值,并保持其切片长度和容量不变。

归纳起来,clear 函数能够解决以下几类问题:

总之,当需要将切片或映射类型的值清空时,都可以使用 clear 函数。但是需要注意以下几点:

以下是一些使用 clear 函数的示例,因为 Go 1.21.0 还未发布,要正常运行下面代码,请安装 Go tip 版本。或者使用 Go playground 运行,地址:https://go.dev/play/p/dgf62WVxPxg?v=gotip。

package main

import (
 "fmt"
)

func main() {
 // clear a slice
 s := []int{1, 2, 3, 4}
 fmt.Println(s) // [1 2 3 4]
 clear(s)
 fmt.Println(s) // [0 0 0 0]

 // clear a map
 m := map[string]string{"foo": "bar", "baz": "qux"}
 fmt.Println(m) // map[foo:bar baz:qux]
 clear(m)
 fmt.Println(m) // map[]

 // clear a constrained type parameter
 type MySlice []int
 type MyMap map[string]int
 var ms MySlice = []int{5, 6, 7, 8}
 var mm MyMap = map[string]int{"one": 1, "two": 2}
 fmt.Println(ms) // [5 6 7 8]
 fmt.Println(mm) // map[one:1 two:2]
 clear(ms)
 clear(mm)
 fmt.Println(ms) // [0 0 0 0]
 fmt.Println(mm) // map[]
}

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8