103

我正在寻找.clear() 原始类型的 c++ 函数之类的东西map

还是我应该只创建一个新地图?

更新:感谢您的回答。通过查看答案,我刚刚意识到有时创建新地图可能会导致一些我们不想要的不一致。考虑以下示例:

var a map[string]string
var b map[string]string

func main() {
    a = make(map[string]string)
    b=a
    a["hello"]="world"
    a = nil
    fmt.Println(b["hello"])
}

我的意思是,这和c++中的函数还是有区别的.clear(),它会清除对象中的内容。

4

5 回答 5

134

您可能应该只创建一个新地图。没有真正的理由费心尝试清除现有的地图,除非多段代码引用同一个地图,并且其中一段明确需要清除这些值,以便其他代码段可以看到此更改。

所以,是的,你可能应该说

mymap = make(map[keytype]valtype)

如果您出于某种原因确实需要清除现有地图,这很简单:

for k := range m {
    delete(m, k)
}
于 2012-12-11T01:52:07.373 回答
29

与 C++ 不同,Go 是一种垃圾收集语言。你需要以不同的方式思考问题。

当你制作一张新地图时

a := map[string]string{"hello": "world"}
a = make(map[string]string)

原始地图最终将被垃圾收集;你不需要手动清除它。但请记住,映射(和切片)是引用类型;你用make(). 仅当没有对底层映射的引用时,才会对底层映射进行垃圾收集。因此,当你这样做

a := map[string]string{"hello": "world"}
b := a
a = make(map[string]string)

原始数组不会被垃圾收集(直到 b 被垃圾收集或 b 引用其他东西)。

于 2012-12-12T06:58:25.827 回答
8
// Method - I , say book is name of map
for k := range book {
    delete(book, k)
}

// Method - II
book = make(map[string]int)

// Method - III
book = map[string]int{}
于 2020-09-06T09:13:06.323 回答
1

通用maps包的 Go 问题 ( https://github.com/golang/go/issues/47649 ) 提供maps.Clear

该软件包位于golang.org/x/exp/maps(实验性,不包括在兼容性保证中)

// Clear removes all entries from m, leaving it empty.
func Clear[M ~map[K]V, K comparable, V any](m 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

于 2022-01-21T23:13:43.260 回答
-6

如果您尝试循环执行此操作,则可以利用初始化为您清除地图。例如:

for i:=0; i<2; i++ {
    animalNames := make(map[string]string)
    switch i {
        case 0:
            animalNames["cat"] = "Patches"
        case 1:
            animalNames["dog"] = "Spot";
    }

    fmt.Println("For map instance", i)
    for key, value := range animalNames {
        fmt.Println(key, value)
    }
    fmt.Println("-----------\n")
}

执行此操作时,它会清除先前的地图并从空地图开始。输出验证了这一点:

$ go run maptests.go 
For map instance 0
cat Patches
-----------

For map instance 1
dog Spot
-----------
于 2017-02-16T22:00:56.013 回答