Golang中如何清空map[string]int类型的变量
Golang中如何清空map[string]int类型的变量 有哪些方法可以清空 map 的键和值?
for k := range m {
delete(m, k)
}
有没有不使用 for 循环的更简短或其他方法?
5 回复
我在生产服务中广泛使用这种“分配一个新映射”的策略。 是的,会被垃圾回收。
func main() {
fmt.Println("hello world")
}
如果你想删除所有的值,你可以重新分配这个映射。
package main
import (
"fmt"
)
func main() {
a := make(map[string]string)
a["apple"] = "a"
a["banana"] = "b"
fmt.Println("before ", a)
a = make(map[string]string)
fmt.Println("after ", a)
}
我相信垃圾回收器会回收这部分内存。
Sinisa:
有更简短的方法吗?
Go 语言并非为代码高尔夫而设计。
Sinisa:
有哪些方法可以清空[所有]映射的键和值[以便重用]?
一如既往,使用简单、惯用的代码形式,为编译器和运行时提供最佳的优化机会。
Go 是开源的。请查阅源代码。
commit aee71dd70b3779c66950ce6a952deca13d48e55e
cmd/compile: optimize map-clearing range idiom replace map clears of the form: for k := range m { delete(m, k) } (where m is map with key type that is reflexive for ==) with a new runtime function that clears the maps backing array with a memclr and reinitializes the hmap struct.
Sinisa:
for k := range m { delete(m, k) }
你正在使用最优的形式。
在Golang中清空map[string]int变量有以下几种方法:
1. 重新分配新map(推荐)
m = make(map[string]int)
这是最简洁高效的方法,时间复杂度O(1),让GC回收旧map。
2. 使用for循环删除所有键
for k := range m {
delete(m, k)
}
这是你提到的方法,时间复杂度O(n)。
3. 重新分配同类型空map
m = map[string]int{}
与make()效果相同,都是分配新的空map。
示例代码对比:
package main
import "fmt"
func main() {
// 初始map
m := map[string]int{"a": 1, "b": 2, "c": 3}
fmt.Println("原始map:", m) // map[a:1 b:2 c:3]
// 方法1: 重新make
m = make(map[string]int)
fmt.Println("make后:", m) // map[]
// 重新填充数据
m["x"] = 10
m["y"] = 20
fmt.Println("重新赋值后:", m) // map[x:10 y:20]
// 方法2: 赋值为空map字面量
m = map[string]int{}
fmt.Println("空字面量后:", m) // map[]
}
性能考虑:
m = make(map[string]int)或m = map[string]int{}:立即清空,GC处理旧数据for k := range m { delete(m, k) }:遍历删除,保留map容量
如果需要保留map的容量(cap),使用for循环删除;如果需要完全清空并重新开始,直接重新分配是最佳选择。


