在golang中,是否可以从类型本身获取reflect.Type,从名称获取string?
是否可以在不必实例化的情况下获取t1的reflect.Type在golang中,是否可以从类型本身获取reflect.Type,从名称获取string?,go,reflection,types,go-reflect,Go,Reflection,Types,Go Reflect,是否可以在不必实例化的情况下获取t1的reflect.Type 是否可以通过将名称“t1”作为字符串来获取t1的reflect.Type 在1号,是的,有点: type t1 struct { i int; s string } var v1 reflect.Type = /* how to set to t1's reflect.Type? */ 不需要实例化。然而,Go没有类型文本,我想这就是你想要的。要获取类型的运行时值,需要具有某种类型的值。如果您不想或无法在运行时创建该值,则可以从类
type t1 struct { i int; s string }
var v1 reflect.Type = /* how to set to t1's reflect.Type? */
不需要实例化。然而,Go没有类型文本,我想这就是你想要的。要获取类型的运行时值,需要具有某种类型的值。如果您不想或无法在运行时创建该值,则可以从类型化的nil中提取该值。如果您不喜欢每次都查找它,可以将此运行时类型存储在变量中
在2号,不,不是真的。这需要Go运行时在当前二进制文件中维护所有类型的映射,这有很多问题。您可以创建一个类型注册表包,并通过字符串注册您可能想要检索的所有类型,但这总是不完整的,如果您知道您想要什么类型,您可以始终使用TypeOf。由于您可以使用匿名类型,而且像“t1”这样的名称不一定是唯一的,因为另一个包可能具有相同名称的类型,因此情况变得更加复杂。Go运行时可以提供一个函数,通过字符串名给出类型,但我怀疑这会发生。谢谢。你说的每句话都很有道理。使用nil非常狡猾-以前从未见过这种把戏。
reflect.TypeOf((*t1)(nil)).Elem().Name()
只提供了“t1”
(即没有包的结构名),就像在haskell中将(未定义的::Type)
作为类型参数传递一样
var v1 reflect.Type = reflect.TypeOf((*t1)(nil)).Elem()
fmt.Println(v1) // prints "main.t1"