Go 1.21
使用内置的 clear
。
func main() {
m := map[string]int{"foo": 1}
clear(m)
}
这是一个单个函数调用,具有次要但重要的优点,它将删除不可反射键(有关详细信息,请参阅下文)。标准库的maps
包不再具有maps.Clear
。
Go 1.18 到 1.20
您可以使用maps.Clear
。该函数属于golang.org/x/exp/maps
包(实验性质,不受兼容性保证的覆盖)
Clear会从m中移除所有条目,使其变为空。
示例用法:
func main() {
testMap := map[string]int{"gopher": 1, "badger": 2}
maps.Clear(testMap)
fmt.Println(testMap)
testMap["zebra"] = 2000
fmt.Println(testMap)
}
操场:
https://go.dev/play/p/qIdnGrd0CYs?v=gotip
如果你不想依赖实验性的包,你可以复制粘贴源代码,实际上非常简单:
func Clear[M ~map[K]V, K comparable, V any](m M) {
for k := range m {
delete(m, k)
}
}
重要提示:就像内置的delete
一样,maps.Clear
的实现也不会从地图中删除非自反键。原因是对于非自反键,根据定义,x == x
为假。非自反键是NaN浮点数和其他支持比较运算符但包含NaN浮点数的类型。
请查看以下代码以了解其含义:
func main() {
m := map[float64]string{}
m[1.0] = "foo"
k := math.NaN()
fmt.Println(k == k)
m[k] = "bar"
maps.Clear(m)
fmt.Printf("len: %d, content: %v\n", len(m), m)
a := map[[2]float64]string{}
a[[2]float64{1.0, 2.0}] = "foo"
h := [2]float64{1.0, math.NaN()}
fmt.Println(h == h)
a[h] = "bar"
maps.Clear(a)
fmt.Printf("len: %d, content: %v\n", len(a), a)
}
操场:
https://go.dev/play/p/LWfiD3iPA8Q