如何清除 Go 中的地图?

新手上路,请多包涵

我正在寻找类似于 c++ 函数 .clear() 的原始类型 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() 函数不同,会清空对象中的内容。

原文由 lavin 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 569
2 个回答

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

所以是的,你可能应该说

mymap = make(map[keytype]valtype)


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

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

原文由 Lily Ballard 发布,翻译遵循 CC BY-SA 3.0 许可协议

与 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 引用其他内容)。

原文由 John Smith 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题