为了账号安全,请及时绑定邮箱和手机立即绑定

Go 中的结构集

Go 中的结构集

Go
湖上湖 2021-12-07 10:25:08
如果我有许多要存储的结构:type Stuff struct {    a string    b string}我可以用切片来做到这一点,但似乎使用正确的集合结构会使用更少的内存。不幸的是,Go 没有固定的结构。每个人都建议使用,map[Stuff]struct{}但这不起作用,因为它Stuff是一个结构体。大家有什么好的解决办法吗?理想情况下无需下载库。
查看完整描述

1 回答

?
繁星coding

TA贡献1797条经验 获得超4个赞

通常 set 和 map 数据结构需要比在普通数组或切片中存储值列表更多的内存,因为 set 和 map 提供了有效的附加功能,如唯一性或通过键检索值。

如果您想要最少的内存使用量,只需将它们存储在一个切片中,例如[]Stuff. 如果您在多个位置使用这些值,那么仅存储它们的指针也可能是有利可图的,例如[]*Stuff,因此每个存储相同Stuff值的位置都可以存储相同的指针(无需复制该值)。

如果您只想存储唯一的结构值,那么集合确实是最方便的选择,在 Go 中使用map.

没有任何问题map[Stuff]struct{},它有效。对地图键类型要求

比较操作符==和=必须为键类型的操作数被完全定义!; 因此键类型不能是函数、映射或切片。

Stuff是一个结构体,如果满足以下条件,Go 中的结构体是可比的

如果所有字段都具有可比性,则结构值具有可比性。如果它们对应的非空白字段相等,则两个结构值相等。

如果您的Stuff结构是您发布的内容,则它是可比较的:它仅包含可比较类型的字段string

另请注意,如果您想要一个集合数据结构,如果您使用bool作为值类型(例如map[Stuff]bool)和true作为值,则更清楚,然后您可以简单地使用索引来测试值是否在地图中,因为索引表达式产生如果键(在您的情况下)不在地图中,则值类型(falsefor bool)的零值Stuff,正确地告诉您要查找的值不在“集合”中。(如果它在地图中,它的关联true值是索引表达式的结果 - 正确地告诉它在地图中)。


查看完整回答
反对 回复 2021-12-07
  • 1 回答
  • 0 关注
  • 159 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信