donglun7151
2016-11-30 03:28
浏览 118
已采纳

Golang反映:从名称获取类型表示形式?

Is there a way to use the reflection libraries in Go to go from the name of a type to its Type representation?

I've got a library where the user needs to provide Type representations for some code generation. I know it must be possible (in a sense) because they can just create a variable of that type and call the TypeOf function, but is there a way to circumvent this and just get representation from the name?

图片转代码服务由CSDN问答提供 功能建议

是否可以使用反射库,从类型名称转到其类型表示形式?

我有一个库,用户需要在其中提供某些代码生成的类型表示形式。 我知道这一定是有可能的,因为它们只能创建该类型的变量并调用 TypeOf函数,但是有一种方法可以绕过它,而仅从名称中获取表示形式?

  • 写回答
  • 好问题 提建议
  • 追加酬金
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • dsgoj7457 2016-11-30 07:52
    已采纳

    The question is not quite explicit, it can be interpreted in 2 ways, to one of which the answer is no, not possible; and the other to which the answer is yes, it's possible.

    At runtime

    If the type name is provided as a string value, then at runtime it's not possible as types that are not referred to explicitly may not get compiled into the final executable binary (and thus obviously become unreachable, "unknown" at runtime). For details see Splitting client/server code. For possible workarounds see Call all functions with special prefix or suffix in Golang.

    At "coding" time

    If we're talking about "coding" time (source code writing / generating), then it's possible without creating / allocating a variable of the given type and calling reflect.TypeOf() and passing the variable.

    You may start from the pointer to the type, and use a typed nil pointer value without allocation, and you can navigate from its reflect.Type descriptor to the descriptor of the base type (or element type) of the pointer using Type.Elem().

    This is how it looks like:

    t := reflect.TypeOf((*YourType)(nil)).Elem()
    

    The type descriptor t above will be identical to t2 below:

    var x YourType
    t2 := reflect.TypeOf(x)
    
    fmt.Println(t, t2)
    fmt.Println(t == t2)
    

    Output of the above application (try it on the Go Playground):

    main.YourType main.YourType
    true
    
    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题