猿问

Go 中的结构集

如果我有许多要存储的结构:


type Stuff struct {

    a string

    b string

}

我可以用切片来做到这一点,但似乎使用正确的集合结构会使用更少的内存。


不幸的是,Go 没有固定的结构。每个人都建议使用,map[Stuff]struct{}但这不起作用,因为它Stuff是一个结构体。大家有什么好的解决办法吗?理想情况下无需下载库。


湖上湖
浏览 160回答 1
1回答

繁星coding

通常 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值是索引表达式的结果 - 正确地告诉它在地图中)。
随时随地看视频慕课网APP

相关分类

Go
我要回答