在同一个包中区分具有相同名称的结构

时间:2015-11-27 18:29:38

标签: reflection go identifier

背景

我正在尝试缓存一些结构信息以提高效率,但是在同一个包中区分具有相同名称的struct时遇到了问题。

示例代码:

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)
}

问题

无法找到合适的唯一键:

  • 名称与“测试”相同
  • PkgPath具有相同的功能,因为两个功能都在同一个包中
  • 指针等是因为需要一致的密钥,否则缓存是没有意义的

任何人都可以帮助找到一种唯一识别这些结构的方法吗?

P.S。我确实意识到更改结构名称可以解决问题,但需要处理这种情况,因为我有一个其他人将调用的通用库,并且可能具有像上面示例所定义的结构。

1 个答案:

答案 0 :(得分:2)

要唯一标识地图中的类型,请使用reflect.Type作为地图键:

var cache map[reflect.Type]cachedType

这是reflect documentation

推荐的
  

要测试[type]相等性,请直接比较Types。