英文:
Go Differentiate Between Structs with same name in the same package
问题
背景:
我正在尝试为了提高效率而缓存一些结构体信息,但在同一个包中的同名结构体之间区分起来有些困难。
示例代码:
func Struct(s interface{}) {
val := reflect.ValueOf(s)
typ := val.Type()
// 在映射中缓存,但用什么键?
typ.Name() // 不够好
typ.PkgPath + typ.Name() // 不够好
}
func Caller1() {
type Test struct {
Name string
}
t := Test{
Name: "Test Name",
}
Struct(t)
}
func Caller2() {
type Test struct {
Address string
Other string
}
t := Test{
Address: "Test Address",
Other: "OTHER",
}
Struct(t)
}
问题
无法找到一个适当的唯一键,因为:
- 名称相同为"Test"
- PkgPath相同,因为两个函数都在同一个包中
- 指针等不行,因为需要一个一致的键,否则缓存就没有意义
有人能帮忙找到一种唯一标识这些结构体的方法吗?
P.S. 我意识到更改结构体名称可以解决这个问题,但需要处理这种情况,因为我有一个通用库,其他人会调用它,并且可能会像上面的示例中定义结构体。
英文:
Background:
I am trying to cache some struct information for efficiency but am having trouble differentiating between struct with the same name, within the same package.
Example Code:
func Struct(s interface{}){
val := reflect.ValueOf(s)
typ := val.Type()
// cache in map, but with what key?
typ.Name() // not good enough
typ.PkgPath + typ.Name() // not good enough
}
func Caller1() {
type Test struct {
Name string
}
t:= Test{
Name:"Test Name",
}
Struct(t)
}
func Caller2() {
type Test struct {
Address string
Other string
}
t:= Test{
Address:"Test Address",
Other:"OTHER",
}
Struct(t)
}
Problem
Can't find a proper unique key as:
- Name is the same "Test"
- PkgPath with be identical as both functions are in same package
- Pointers etc is out because need a consistent key otherwise caching would be pointless
Can anyone help in finding a way to uniquely identify these structs?
P.S. I do realize that changing of the struct name would solve the issue, but need to handle this scenario as I have a generic library that others will be calling and may have the structs defined like the above example.
答案1
得分: 2
要在映射中唯一标识类型,请使用reflect.Type
作为映射的键:
var cache map[reflect.Type]cachedType
这是由reflect文档推荐的方法:
> 要测试类型的相等性,请直接比较类型。
英文:
To uniquely identify types in a map, use reflect.Type
as the map key:
var cache map[reflect.Type]cachedType
This is recommended by the reflect documentation:
> To test for [type] equality, compare the Types directly.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论