【问题标题】:Thrift go support of map with struct value as keyThrift go 支持以结构值为键的映射
【发布时间】: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&lt;&gt; 与复杂的键一起使用,其他一切都没有问题。顺便说一句,我仍然相信它一定是可能的。我只是没有那么多时间深入研究。想法和质量补丁总是受欢迎的。 ;-)
  • 嗯,我的公司大量使用它肯定很有用。我自己的项目试图完全依赖节俭来构建跨语言核心数据,这有点阻碍。我之前的措辞并不准确。一个快速的想法可能是为所有用作映射键的结构(包括用作字段的结构)和其他结构的指针类型生成 100% 的值类型。我感觉这是可能的。 :)
  • 作为解决方法,可以在我的代码中动态地将结构转换为字符串并将它们定义为映射键。有点贵,但很管用。

标签: serialization go thrift


【解决方案1】:

结构(没有指针)只能在某些有限的情况下用作映射键(它们必须根据http://golang.org/ref/spec#Comparison_operators 进行比较); AppIdLeveledHashKeyTimeKeyHour 可能不符合这个定义,因此实际上不可能在不使用键指针的情况下构建映射。

【讨论】:

  • 嗨,埃文,感谢您的解释。当我尝试更多地简化键以满足这些条件时,Thrift-go 仍然会生成指针类型作为键,嗯.. 必须检查其他解决方案。
  • @Evan:到目前为止是正确的。我和一些人讨论过这些东西,但我仍然认为它必须通过某种间接方式以某种方式成为可能,因为“接口值是可比较的。如果两个接口值具有相同的动态类型和相同的动态值,或者如果两者的值都是 nil。"。因此,如果密钥类型被包装到某个实现类似接口的容器中,那不应该工作吗?
  • 只有具有可比动态值的接口才具有可比性。例如,请参阅 play.golang.org/p/E0kDtua92Y,它会导致运行时恐慌,因为切片不可比较。
猜你喜欢
  • 1970-01-01
  • 2013-08-07
  • 2012-01-07
  • 2016-09-09
  • 1970-01-01
  • 2019-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多