Go中的结构集

时间:2016-01-14 10:00:39

标签: struct go set

如果我想要存储多个结构:

type Stuff struct {
    a string
    b string
}

我可以用切片来做,但似乎使用较少的内存来使用正确的设置结构。

不幸的是,Go没有固定的结构。每个人都建议使用map[Stuff]struct{},但这不起作用,因为Stuff是一个结构。谁有任何好的解决方案?理想情况下无需下载库。

1 个答案:

答案 0 :(得分:2)

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

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

如果你只想存储唯一的struct值,那么在Go实现map时,该集合确实是最方便的选择。

map[Stuff]struct{}没有任何问题,它有效。地图requirement for the key type

  

必须为密钥类型的操作数完全定义comparison operators ==和!=;因此,键类型不能是函数,映射或切片。

Stuff是一个结构,而structs in Go are comparable是:

  

如果所有字段都具有可比性,则结构值具有可比性。如果相应的非blank字段相等,则两个struct值相等。

如果您的Stuff结构是您发布的结构,则它具有可比性:它只包含可比类型string的字段。

另请注意,如果您需要设置数据结构,如果您使用bool作为值类型(例如map[Stuff]bool)和true作为值,则会更清楚,然后您可以如果密钥({{1}在你的情况下)不在地图中,正确告诉你正在寻找的价值不在“集合”中。 (如果它在地图中,则其关联的false值是索引表达式的结果 - 正确地告诉它在地图中。)