定义map[type]interface{}
等内容的惯用方法是什么?
到目前为止,我可以看到类型(作为关键字)不是可比较的,因此不能用作地图中的键。也许我走错了路,所以我会接受任何建议。
TL; DR;
示例动机
让我们在appplication模型中使用类型,称为人,存储在名为&的表中#34; rdbms 的人34> 。
如果我想将实体对象人链接到表名。根据定义所做的事情并没有结合在一起,因此避免使用"非自然相关的"来污染Person结构是明智的。 (这是我的基于java-OO的思想出现的地方)[指针|值] - 识别方法,所以地图可以派上用场,对吗? (地图非常适合关联来自不同世界或集合的事物,对吗?)
var tableNameByType map[type]string = map[type]string{
Person: "person",
}
这句话导致编译器对我抱怨expected type, found 'type'
。我试过使用而不是类型,接口{}和结构,没有更好的结果。
提前,感谢您花时间阅读我。
答案 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()
来避免实例化结构值。