【问题标题】:Invalid map key type "identifier"无效的映射键类型“标识符”
【发布时间】:2021-12-09 23:33:48
【问题描述】:

下面的类型定义:

type tuple struct{
    key string
    value string
}

type identifier struct{
    metricName tuple
    labels []tuple
}

type value struct{
    timestamp int64
    timeSeriesValue float64  
}

type DataModel map[identifier][]value

给出错误:invalid map key type identifier

struct 类型可以是 Go 中的键

identifier 类型没有可比性吗?

【问题讨论】:

    标签: dictionary go


    【解决方案1】:

    映射键类型必须是可比较的,虽然结构类型允许作为映射键是对的,但它们仍然需要可比较。结构只有在它们的字段是可比较的情况下才可比较,并且由于切片不可比较,identifier 不是可比较的类型。因此,它不能是映射键类型。

    Go 规范在这两部分中非常清楚地说明了这一点:


    您最初的问题是关于 identifier 不可比较并且是无效的映射键类型。但就您关于如何处理的后续问题而言:

    仅根据您在此处的代码,很难说最好的方法,但我会注意到指针值是可比较的,因此您将 DataModel 定义为可能会很好

    type DataModel map[*identifier][]value
    

    【讨论】:

    • Slice是可变类型,所以map键不能是可变类型,是的,但是,但是,如何克服这个问题?
    • 仅根据您在这里的代码很难说最好的方法,但我会注意到指针值是可比较的,因此将 DataModel 定义为 type DataModel map[*identifier][]value 可能对您有用.
    • type Labels *[]tuple 然后labels Labels?
    • 是的,这看起来是个不错的方法。
    • 我不确定您是否会对*[]tuple 感到满意,但是很难理解您希望通过将标签放在地图的键中来实现什么。不同的标识符会有相同的[]tuple,因此它的地址是相关的吗?如果想法是标识符名称和标签的值可以比较,仅仅因为两个[]tuples 没有相同的地址,并不意味着它们没有相同的标签。我觉得这不是您想要实现的数据的正确组织。
    【解决方案2】:

    必须为键类型的操作数完全定义比较运算符 == 和 !=;因此键类型不能是函数、映射或切片

    https://golang.org/ref/spec#Map_types

    因此,它不会编译,因为切片是用作键的结构的一部分。

    【讨论】:

      猜你喜欢
      • 2018-06-04
      • 2019-08-27
      • 1970-01-01
      • 2012-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-20
      • 1970-01-01
      相关资源
      最近更新 更多