如何清除Go中的地图?

我正在寻找类似于c ++函数.clear()的原始typesmap

或者我应该只是创build一个新的地图?

更新:谢谢你的回答。 通过查看答案,我刚刚意识到,有时创build一个新的地图可能会导致一些我们不想要的不一致。 考虑下面的例子:

 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()函数,它将清除对象中的内容。

你可能应该只是创build一个新的地图。 除非相同的地图被多个代码片段引用,并且一个片段明确地需要清除这些值,使得这个变化对于其他代码片段可见,否则没有任何真正的理由去打扰现有的片断。

所以,你可能应该说

 mymap = make(map[keytype]valtype) 

如果你真的需要清除现有的地图,这是很简单的:

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

与C ++不同,Go是一种垃圾收集语言。 你需要有点不同的想法。

当你制作一个新的地图

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

原始地图最终会被垃圾收集; 您不需要手动清除它。 但请记住,地图(和切片)是参考types; 你用make()创build它们。 只有当没有对它的引用时,底层的地图才会被垃圾收集。 因此,当你这样做

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

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

未初始化映射的值为零 。

 map = nil; 

应该做。 那么当然,你需要创build一个新的地图。

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

 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") } 

执行此操作时,将清除以前的地图,并从空白的地图开始。 这是由输出validation:

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