登录
首页 >  Golang >  Go问答

你能有一张没有go价值的地图吗?

来源:stackoverflow

时间:2024-03-25 16:51:33 404浏览 收藏

在 Go 中,地图中的每个键都需要指定一个值。使用空结构 `struct{}` 作为值可以避免存储实际数据,仅存储键。这种方法可以节省空间,但也会导致更复杂的语法和键查找。相比之下,使用 `map[int]bool` 更加直接,内存开销也更低。对于大型映射,如果内存受限,可以使用 `struct{}`;否则,建议使用 `map[int]bool`。

问题内容

我问是因为我喜欢地图不允许多个键。我知道您可以执行如下操作,其中您的值是布尔值或空结构,但是有没有办法绕过为您的键指定任何值?必须指定空结构有什么好处吗?

相关问题,但重点关注仅附加唯一值。

type N struct {}

func tengoQueCagar() {
    var map_almost_empty_value1 = map[int]bool{0:true,1:false}
    var map_almost_empty_value2 = map[int]struct{}{0:struct{}{},1:struct{}{}} //long and seems like lame syntax...
    var map_almost_empty_value3 = map[int]N{0:N{},1:N{}} //shorter.. better?

    var map_not_possible_empty_value_2 = map[int]nil{0:nil,1:nil} // better than empty struct syntax... but not possible
    var map_not_possible_empty_value_2 = map[int]{0,1} // ideally possible... but not... 

    //do something...
}

解决方案


struct{} 需要 0 个字节来存储。如果您使用 struct{} 值声明地图,则您将仅存储地图键。

有一篇关于它的很好的博客文章: https://dave.cheney.net/2014/03/25/the-empty-struct

如果您想像集合一样使用映射,为其声明一个单独的类型可能会有所帮助:

type intset map[int]struct{}

并且您可以向其中添加一些方便的方法,例如:

func (i IntSet) Has(v int) bool {
  _, ok := i[v]
  return ok
}

要直接回答您的问题:请参阅下文!

这种“空 struct{} 作为映射值技巧”经常出现,支持的论点始终采用“因此值不需要存储空间”的形式。

另一个自然要做的事情是使用 map[int]bool

如果内存确实是您的应用的一个限制(例如,因为您在映射中存储了数百万或数十亿个键),那么可以:使用 struct{}。对于所有其他正常情况:使用 struct{} 会使此类映射文字变得尴尬,并且键查找变得更加复杂,因为您必须使用逗号-ok-变体 (if _,ok := m[k ];好的{

对于 bool 值,您可以执行简单的 m[k],这样输入量较少且更易于理解。

我个人认为使用 struct{} 作为地图值是不必要的、不成熟的、过于聪明的优化。如果您确实需要保存这几个字节,因为您的映射将包含数百万个条目,那么映射可能不是正确的数据结构:根据用例位向量、稀疏数据结构甚至概率数据结构(bloom-、cuckoo) -filters)、union-find 等可能更适合。

答案:不。在地图文字中,您必须指定每个键。 (一般经验法则:go 中没有语法糖;go 中没有聪明的快捷方式;go 中的一切都是明确的。)

终于介绍完啦!小伙伴们,这篇关于《你能有一张没有go价值的地图吗?》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>