最优雅的方式来代表很多领域

时间:2018-01-13 03:12:12

标签: 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文件。
  • 将布尔值与每个属性相关联(奖励点用于关联任何一种任意类型的方式)。
  • 轻松地将这些字符串显示给人。
  • 轻松计算“设置”的数量(也就是说,当一个早起的人被召唤时,有正确的红利,并且作为一个大头钉,但没有别的,返回3)。 LI>
  • 应该尽可能强类型(要求不存在的属性应该是不可能的,或者至少是困难的。您应该能够通过查看代码来查看所有属性。)
  • 保留此订单将是一个加分,但并非绝对必要。

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

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

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

我在这里缺少什么,或者我是否必须妥协?

2 个答案:

答案 0 :(得分:3)

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

  • JSON存储为" 010101" string或base64(11个字符)。
  • 简单显示:只需按照它们存储在bitset中的顺序定义一个字符串数组。
  • 轻松计算有多少"设置" - 使用" popcount" (开源实现很容易实现)。
  • 自然保留顺序 - 第一个属性将始终为位0等。

如果您有超过64个属性,则可以使用val files = List("a.txt", "b.txt", "c.txt") // and so on; val source = Source(files).flatMapConcat(f => FileIO.fromPath(Paths.get(f))) val sink = Sink.fold[ByteString, ByteString](ByteString(""))(_ ++ ByteString("\n" ++ _) // Concatenate source.toMat(sink)(Keep.right).run().flatMap(concatByteStr => writeByteStrToFile(concatByteStr, "an-output-file.txt"))

答案 1 :(得分:0)

你可以使用map [int] interface {}来存储接口内任何长度的值,使用整数作为键,或者也可以使用切片接口在数据内部循环,如[] interface {}。稍后您可以轻松键入断言接口以获取基础值,在您的情况下为字符串。 由于它将是界面或界面图的切片,您可以轻松编组它将其转换为json并保存到文件中,可以轻松读取或写入。