在golang中,是否可以从类型本身获取reflect.Type,从名称获取string?

在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没有类型文本,我想这就是你想要的。要获取类型的运行时值,需要具有某种类型的值。如果您不想或无法在运行时创建该值,则可以从类

是否可以在不必实例化的情况下获取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没有类型文本,我想这就是你想要的。要获取类型的运行时值,需要具有某种类型的值。如果您不想或无法在运行时创建该值,则可以从类型化的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"