区分同一个包中同名的结构体

背景:


我正在尝试缓存一些结构体信息以提高效率,但无法区分同一个包内的同名结构体。


示例代码:


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 相同,因为两个函数都在同一个包中

  • 指针等已失效,因为需要一致的键,否则缓存将毫无意义

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

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


红糖糍粑
浏览 218回答 1
1回答

HUX布斯

要唯一标识地图中的类型,请reflect.Type用作地图键:var cache map[reflect.Type]cachedType这是反射文档推荐的:要测试 [type] 相等性,请直接比较类型。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go