go - 代表许多领域的最优雅的方式

标签 go data-structures

所以,我有这个属性列表,我想在我的 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 文件。
  • 将一个 bool 值与每个属性相关联(将任何一种任意类型相关联的方法加分)。
  • 轻松向人类显示这些字符串。
  • 轻松计算有多少已“设置”(即,当调用早起的人时,该函数具有正确的红利,并且像大头针一样敏锐,但没有别的,返回 3)。<
  • 应尽可能强类型化(请求不存在的属性应该是不可能的,或者至少是困难的。您应该能够通过查看代码来查看所有属性)。<
  • 保留此顺序会更好,但并非绝对必要。

到目前为止我想到的方法是:

  • 将所有这些作为字段的结构,但计数函数编写起来不够优雅,字段的“漂亮”字符串名称必须存储在其他地方。即使这可以通过标签解决,计数问题仍然存在。

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

我是否遗漏了什么,或者我必须妥协吗?

最佳答案

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

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

如果你有超过64个属性,你可以使用math/big

关于go - 代表许多领域的最优雅的方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48236601/

相关文章:

c - 将结构与零进行比较的首选方法

python - 列表理解与过滤与删除

c++ - 存储和重用 vector 迭代器值是否安全?

amazon-web-services - AWS Lambda函数将X-Amz-Signature附加到S3 URL

GoLang - 顺序与并发

go - 类型导入周期

javascript:对象可以字面上替换数组吗?

转到 http api 服务器和 socket.io

go - 如果行不存在,QueryRow().Scan() 返回错误

javascript - 从 javascript 对象中删除较少的序列计数