Go 表示多个字段的最优雅方式

Go 表示多个字段的最优雅方式,go,data-structures,Go,Data Structures,所以,我有这个属性列表,我想在我的Go代码中表示。也就是说,我正在寻找一些能够传达所有这些信息的数据结构 Mind like a diamond Knows what's best Shoes that cut

所以,我有这个属性列表,我想在我的Go代码中表示。也就是说,我正在寻找一些能够传达所有这些信息的数据结构

Mind like a diamond
Knows what's best
Shoes that cut                                                                                                                                                                                    
Eyes that burn like cigarettes
The right allocations
Fast                                                                                                                                                                                              
Thorough
Sharp as a tack
Playing with her jewellry
Putting up her hair
Touring the facilities                                                                                                                                                                            
Picking up slack
Short skirt
Long jacket                                                                                                                                                                                       
Gets up early
Stays up late
Uninterrupted prosperity
Uses a machete to cut through red tape
Fingernails that shine like justice
Voice that is dark like tinted glass
Smooth liquidation
Right dividends
Wants a car with a cupholder arm rest
Wants a car that will get her there
Changing her name from Kitty to Karen
Trading her MG for a white Chrysler LeBaron
他们不会很快改变,但我想用他们做以下事情:

  • 从JSON文件中读取并将其写入JSON文件
  • 将布尔值与每个属性关联(关联任意一种类型的方式可获得额外点数)
  • 轻松地向用户显示这些字符串
  • 很容易计算出有多少是“set”(也就是说,当对早起的人调用此函数时,它具有正确的红利,并且非常尖锐,但除此之外,不会返回3)
  • 应该是尽可能强的类型(请求一个不存在的属性应该是不可能的,或者至少是困难的。您应该能够通过查看代码来查看所有属性)
  • 维护这一秩序是有利的,但并非绝对必要
到目前为止,我想到的方法是:

  • 一个包含所有这些字段的结构,但是count函数写起来不雅观,字段的“nice”字符串名必须存储在其他地方。即使可以用标签解决这个问题,计数问题仍然存在

  • 具有常量键的映射(或具有枚举值的数组)。计数是一个简单的循环,键可以是漂亮的字符串名。但是,这会造成请求不存在的键的问题,并且您必须将字典隐藏在函数后面,以阻止用户尝试添加新键


这里是否有我遗漏的东西,或者我必须妥协?

我会使用uint64作为位集(或者实际的位集类型,其中没有内置的,但有些是开源的)。它通过以下方式满足您的要求:

  • JSON存储为“010101”字符串或base64(11个字符)
  • 轻松显示:只需按照存储在位集中的相同顺序定义字符串数组
  • 轻松计算“设置”的数量-使用“popcount”(开源实现很容易获得)
  • 顺序是自然保留的——第一个属性总是位0,以此类推

如果您有64个以上的属性,可以使用
math/big

我会使用uint64作为位集(或实际的位集类型,其中没有内置的,但有些是开源的)。它通过以下方式满足您的要求:

  • JSON存储为“010101”字符串或base64(11个字符)
  • 轻松显示:只需按照存储在位集中的相同顺序定义字符串数组
  • 轻松计算“设置”的数量-使用“popcount”(开源实现很容易获得)
  • 顺序是自然保留的——第一个属性总是位0,以此类推

如果您有64个以上的属性,您可以使用
math/big

您可以使用map[int]interface{}将任意长度的值存储在接口内,并使用integer作为键,或者您还可以使用接口片在数据内循环,如[]interface{}。稍后,您可以轻松地键入assert接口,以获取在您的案例中为字符串的基础值。
由于它将是接口的切片或接口的映射,您可以轻松地将其封送以将其转换为json并保存到易于读取或写入的文件中。

您可以使用map[int]interface{}将任何长度的值存储在接口内,并使用integer作为键,或者您也可以使用接口切片在数据内循环,如下所示[]接口{}。稍后,您可以轻松地键入assert接口以获取底层值,该值在您的案例中是字符串。
因为它将是接口的一部分或接口的映射,所以您可以轻松地将其封送到json并保存到易于读写的文件中。

您忘记了“借用我的笔”。这可以说是最重要的属性,没有它,其余的都是无关的。我反复添加“在花旗银行,我们会不期而遇”和“当她借我的笔时,我们开始交谈”,以及这两件事应该是一件事还是两件事。你忘了“借我的笔”。这可以说是最重要的属性,没有它,其余的一切都无关紧要。我反复加上“在花旗银行,我们会不期而遇”和当她借我的笔时,我们开始讨论“它们应该是一件事还是两件事。我还没有考虑过这一点!那么,你能推荐一些枚举类型的常量来在代码中解决这些问题吗?
girl.Has(constFast)
girl.Set(constissharpastack)
@GrantHill:是的,类似的。我没有考虑过这个!那么你能推荐一些枚举类型的常量来在代码中处理这些吗?
girl.Has(constFast)
girl.Set(constissharpasatck)
@GrantHill:是的,类似的。