一尘不染

Go中的结构集

go

如果我要存储许多结构:

type Stuff struct {
    a string
    b string
}

我可以用片来做,但是看起来使用更少的内存可以使用适当的set结构。

不幸的是,Go没有固定的结构。每个人都建议使用,map[Stuff]struct{}但由于Stuff是结构,所以不起作用。有人有什么好的解决方案吗?理想情况下,无需下载库。


阅读 270

收藏
2020-07-02

共1个答案

一尘不染

通常,设置和映射数据结构比将一组值存储在按设置的普通数组或切片中需要更多的内存,并且映射提供有效的附加功能,例如唯一性或通过键检索值。

如果要最小化内存使用量,只需将它们存储在一个切片中,例如[]Stuff。如果在多个位置使用值,则仅存储其指针也可能会有利可图,例如[]*Stuff,因此,每个存储相同Stuff值的位置都可以存储相同的指针(而不必复制值)。

如果您只想存储唯一的struct值,那么在Go中使用来实现确实是最方便的选择map

没问题map[Stuff]struct{},它可以正常工作。地图密钥类型要求

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

Stuff是一个结构,并且在以下情况下,Go中的结构是可比较的

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

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

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

2020-07-02