【发布时间】:2014-04-20 19:48:27
【问题描述】:
例如,我用 Thrift 0.9.1 试验了 golang 生成
节俭的定义,
struct AppIdLeveledHashKeyTimeKeyHour {
1: required i32 appId
2: required LeveledHashKey leveledHashKey
3: required TimeKeyHour timeKeyHour
}
typedef map<AppIdLeveledHashKeyTimeKeyHour, ...sth else...> EventSliceShardIdValue
在生成的代码中,EventSliceShardIdValue 将是,
type EventSliceShardIdValue map[*AppIdLeveledHashKeyTimeKeyHour]EventSliceAppIdLeveledHashKeyTimeKeyHourValue
你可以发现关键部分是一个代表内存地址的指针。在 golang 中,作为映射键的指针(而不是值或 obj 的哈希)在大多数情况下是无用的。要将某些字段的组合用作映射键,定义应使用值类型,如
map[AppIdLeveledHashKeyTimeKeyHour]EventSliceAppIdLeveledHashKeyTimeKeyHourValue
这是 Thrift 的 go 支持的问题(还是我误用了某事)?任何解决方法可以在节俭中解决这个问题?
【问题讨论】:
-
这是一个非常好的问题。另请参阅THRIFT-2063。
-
谢谢@JensG。使用 Thrift 来定义和维护跨服务/组件的数据结构非常好,但是这个问题使得 Thrift 在 Golang 中毫无用处。
-
没用?不完全的。您不能将
maps<>与复杂的键一起使用,其他一切都没有问题。顺便说一句,我仍然相信它一定是可能的。我只是没有那么多时间深入研究。想法和质量补丁总是受欢迎的。 ;-) -
嗯,我的公司大量使用它肯定很有用。我自己的项目试图完全依赖节俭来构建跨语言核心数据,这有点阻碍。我之前的措辞并不准确。一个快速的想法可能是为所有用作映射键的结构(包括用作字段的结构)和其他结构的指针类型生成 100% 的值类型。我感觉这是可能的。 :)
-
作为解决方法,可以在我的代码中动态地将结构转换为字符串并将它们定义为映射键。有点贵,但很管用。
标签: serialization go thrift