映射具体类型

时间:2018-06-06 22:07:45

标签: go types maps

定义map[type]interface{}等内容的惯用方法是什么?

到目前为止,我可以看到类型(作为关键字)不是可比较的,因此不能用作地图中的键。也许我走错了路,所以我会接受任何建议。

TL; DR;

示例动机

让我们在appplication模型中使用类型,称为,存储在名为&的中#34; rdbms 的人

如果我想将实体对象链接到表名。根据定义所做的事情并没有结合在一起,因此避免使用"非自然相关的"来污染Person结构是明智的。 (这是我的基于java-OO的思想出现的地方)[指针|值] - 识别方法,所以地图可以派上用场,对吗? (地图非常适合关联来自不同世界或集合的事物,对吗?)

var tableNameByType map[type]string = map[type]string{
      Person: "person",
}

这句话导致编译器对我抱怨expected type, found 'type'。我试过使用而不是类型,接口{}和结构,没有更好的结果。

提前,感谢您花时间阅读我。

1 个答案:

答案 0 :(得分:3)

使用reflect.Type作为密钥:

var tableNameByType map[reflect.Type]string = map[reflect.Type]string{
    reflect.TypeOf(Person{}): "person",
}

您可以使用以下命令获取类型的名称:

name := tableNameByType[reflect.TypeOf(Person{})]

...或值v的名称使用:

name := tableNameByType[reflect.ValueOf(v).Type()]

您可以通过在上面的代码中将reflect.TypeOf(Person{})替换为reflect.TypeOf((*Person)(nil)).Elem()来避免实例化结构值。