Golang中如何清空map[string]int类型的变量

Golang中如何清空map[string]int类型的变量 有哪些方法可以清空 map 的键和值?

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

有没有不使用 for 循环的更简短或其他方法?

5 回复

谢谢!

更多关于Golang中如何清空map[string]int类型的变量的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我在生产服务中广泛使用这种“分配一个新映射”的策略。 是的,会被垃圾回收。

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循环删除;如果需要完全清空并重新开始,直接重新分配是最佳选择。

回到顶部