Serialization 以struct值为键的地图的Thrift go支持

Serialization 以struct值为键的地图的Thrift go支持,serialization,go,thrift,Serialization,Go,Thrift,例如,我用节俭0.9.1对golang一代进行了实验 节俭定义 struct AppIdLeveledHashKeyTimeKeyHour { 1: required i32 appId 2: required LeveledHashKey leveledHashKey 3: required TimeKeyHour timeKeyHour } typedef map<AppIdLeveledHashKeyTimeKeyHour, ...sth else...>

例如,我用节俭0.9.1对golang一代进行了实验

节俭定义

struct AppIdLeveledHashKeyTimeKeyHour {
    1: required i32 appId
    2: required LeveledHashKey leveledHashKey
    3: required TimeKeyHour timeKeyHour
}
typedef map<AppIdLeveledHashKeyTimeKeyHour, ...sth else...> EventSliceShardIdValue
您可以发现关键部分是一个表示内存地址的指针。在golang中,指针作为映射键(而不是值或obj的散列)在大多数情况下是无用的。要使用一些字段的组合作为映射键,定义应使用如下值类型

map[AppIdLeveledHashKeyTimeKeyHour]EventSliceAppIdLeveledHashKeyTimeKeyHourValue

这是节俭的支持问题(还是我滥用了某物)?有什么办法可以用节俭来解决这个问题吗

结构(不带指针)只能在某些有限的情况下用作映射键(它们必须是可比的);有可能
AppIdLeveledHashKeyTimeKeyHour
不符合此定义,因此实际上不可能在不使用键指针的情况下构建映射。

Hi Evan,感谢您的解释。当我试图简化密钥以满足这些条件时,Thrift go仍然生成指针类型作为密钥,嗯。。必须检查其他解决方案。@Evan:目前为止正确。我和一些人讨论过这件事,但我仍然认为必须通过某种间接方式使之成为可能,因为“接口值是可比较的。两个接口值是相等的,如果它们具有相同的动态类型和相等的动态值,或者如果两者的值都为零。”。因此,如果将键类型包装到实现可比较接口的某个容器中,这难道不可行吗?只有当接口具有可比较的动态值时,它们才具有可比较性。例如,这会导致运行时恐慌,因为切片是不可比较的。这是一个非常好的问题。另见。谢谢@JensG。使用Thrift来定义和维护跨服务/组件的数据结构真的很好,但是这个问题使得Thrift对于Golang来说毫无用处。没用?不完全是。你不能用复杂的键来使用
贴图
,其他一切都没有问题。顺便说一句,我仍然相信这一定是可能的。我只是没有那么多时间来深入研究这个问题。始终欢迎您提供创意和高质量补丁。;-)嗯,我的公司大量使用它,这肯定是有用的。我自己的项目试图完全依靠节俭来构建跨语言核心数据,但有一点受阻。我以前的措辞不准确。一个快速的想法可能是为所有用作映射键(包括用作字段的结构)的结构生成100%值类型,并为其他结构生成指针类型。我觉得这是可能的作为解决方法,可以在代码中将struct动态转换为string,并将它们定义为映射键。有点贵,但效果不错。
map[AppIdLeveledHashKeyTimeKeyHour]EventSliceAppIdLeveledHashKeyTimeKeyHourValue